扩展类似函数的宏会创建一个单独的标记

时间:2015-08-25 15:08:44

标签: c macros c99

我刚刚发现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()更复杂)。我想知道是否有一个简单的(可能更具可读性)解决方案。

1 个答案:

答案 0 :(得分:1)

我能想到的唯一方法(如果你不能使用令牌连接运算符##)正在使用传统的(预标准)C预处理:

gcc -E -P -traditional-cpp test.c

输出:

void foo_bar(void);
void foobar(void);
void foo-bar(void);

More info