有没有办法阻止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
因为它弄乱了其他东西。
答案 0 :(得分:1)
包含<stdio.h>
可能会也可能不会定义宏功能。在任何一种情况下,都提供了一个真正的功能。
将函数指针命名为标准库函数可能不是最好的主意,但可以执行此操作。为防止宏扩展,您基本上有三个选项:
#undef
它。你说这会弄乱别的东西,虽然这不应该是一个问题 - 这个名字的真正功能仍然存在。对于某些函数,您可能会错过优化或警告(例如,对于printf
等函数)(取决于您的编译器)。不要在宏名称后加上左括号,如
((&f)->putc)('X'); // or (f.putc)('X'); -- looking less confusing.