C对象宏展开为函数宏后未进一步展开问题咨询
问题分析与解决
你的问题出在宏替换后的格式不符合函数式宏的调用规则。
C预处理器对函数式宏(比如f(x))的识别有严格要求:函数式宏的标识符后面必须紧跟左括号(,中间不能有空格。
看你的代码:
- 宏替换后得到的是
f ( x );——f和(之间有空格,预处理器只会把f当作普通标识符,不会触发f(x)的宏展开。 - 如果你希望触发
f(x)的展开,需要让替换后的代码是f(x);(f和(之间无空格)。
调整方案
把你的宏定义改成这样,利用##连接符把A和B无缝拼接,确保替换后f和(紧挨着:
#define A f #define B ( #define C x #define D ) #define f(x) 1 int main () { A##B C D; return 0; }
预处理器处理后会得到f(x);,进而展开成1;。
或者更直接的方式,避免拆分括号类的宏定义:
#define A f(x) #define f(x) 1 int main () { A; return 0; }
核心逻辑就是:函数式宏的调用必须是标识符(参数)的紧凑形式,中间不能有空格,你的替换结果不符合这个规则,所以没触发宏展开。
内容的提问来源于stack exchange,提问作者Daniel Smith
相关产品推荐
相关产品推荐

