我刚刚发现gcc似乎将类似函数的宏的扩展结果视为一个单独的标记。这是一个显示gcc行为的简单示例:
#define f() foo
void f()_bar(void);
void f()bar(void);
void f()-bar(void);
当我执行gcc -E -P test.c
(仅运行预处理器)时,我得到以下输出:
void foo _bar(void);
void foo bar(void);
void foo-bar(void);
似乎在前两个定义中,gcc在扩展宏之后插入空格,以确保它是一个单独的标记。这真的发生在这里吗?
这是否受到任何标准的约束(我无法找到关于该主题的文档)?
我想让_bar
成为同一个标记的一部分。有没有办法做到这一点?我可以使用令牌连接运算符##
但它需要几个级别的宏(因为在实际代码中f()更复杂)。我想知道是否有一个简单的(可能更具可读性)解决方案。
答案 0 :(得分:1)
我能想到的唯一方法(如果你不能使用令牌连接运算符##)正在使用传统的(预标准)C预处理:
gcc -E -P -traditional-cpp test.c
输出:
void foo_bar(void);
void foobar(void);
void foo-bar(void);