防止gcc中的宏扩展不正确

时间:2014-12-18 06:42:58

标签: c gcc

有没有办法阻止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因为它弄乱了其他东西。

1 个答案:

答案 0 :(得分:1)

包含<stdio.h>可能会也可能不会定义宏功能。在任何一种情况下,都提供了一个真正的功能。

将函数指针命名为标准库函数可能不是最好的主意,但可以执行此操作。为防止宏扩展,您基本上有三个选项:

  • #undef它。你说这会弄乱别的东西,虽然这不应该是一个问题 - 这个名字的真正功能仍然存在。对于某些函数,您可能会错过优化或警告(例如,对于printf等函数)(取决于您的编译器)。
  • 不要包含头文件并自行声明该功能。我提到这是为了完整而不是一个真正的建议。如果您只需要在不想包含的标题中提供类型定义,则此功能无效。
  • 不要在宏名称后加上左括号,如

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