kwi*_*tek 8 concatenation c-preprocessor
为什么代码:
#define EXPONENT(num, exp) num ## e ## exp
EXPONENT(1,1)
EXPONENT(1,-1)
EXPONENT(1,+1)
Run Code Online (Sandbox Code Playgroud)
预处理后的更改为:
1e1
1e- 1
1e+ 1
Run Code Online (Sandbox Code Playgroud)
而不是
1e1
1e-1
1e+1
Run Code Online (Sandbox Code Playgroud)
?我怀疑它可能是因为-1,+ 1被解析为两个标记(?).但是,在这种情况下如何获得后者的结果呢?
小智 3
我认为您遇到的问题被认为是未定义的行为。根据gcc 4.3.2 有关串联的文档:
但是,不能一起形成有效令牌的两个令牌无法粘贴在一起。例如,您不能以任一顺序将 x 与 + 连接起来。如果您尝试,预处理器会发出警告并发出两个标记。是否在标记之间放置空格是未定义的。在复杂的宏中经常会发现不必要的 ## 使用。如果您收到此警告,您可能只需删除“##”即可。
另请参阅SO 上的这个答案,它也存在同样的问题。
编辑:
我设法让它工作,但你需要两个宏用于 + 和 -
#define E(X) 1e-##X
int main()
{
double a = E(10); // expands to 1e-10
printf("%e", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)