gpt4 book ai didi

c - 防止 gcc 中错误的宏扩展

转载 作者:行者123 更新时间:2023-11-30 20:39:07 25 4
gpt4 key购买 nike

有什么办法可以阻止 gcc 扩展宏:

#define putc(a) fputc(a)

...

void _putc(char ch) {}
struct foo { void *(putc)(char ch); }
struct foo f = {_putc;}

(&f)->putc('X'); // this is an error because it gets expanded into fputc, which is very inappropriate.

我不想使用#undef putc,因为它会搞乱其他事情。

最佳答案

包括<stdio.h>可以定义也可以不定义宏函数。无论哪种情况,都提供了真正的功能。

将函数指针命名为标准库函数可能不是最好的主意,但您可以这样做。为了防止宏扩展,您基本上有三个选择:

  • #undef它。你说这会搞乱其他事情,尽管这不应该是一个问题——具有该名称的真实函数仍然存在。但是,对于某些函数,您可能会错过优化或警告(例如 printf 等函数)(取决于您的编译器)。
  • 不要包含头文件并自行声明函数。我提到这一点是为了完整性,而不是作为一个真正的建议。如果您需要仅在不想包含的 header 中提供类型定义,则此方法不起作用。
  • 不要在宏名称后面添加左括号,如下所示

    ((&f)->putc)('X'); // or (f.putc)('X'); -- looking less confusing.

关于c - 防止 gcc 中错误的宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com