为什么代码:
#define EXPONENT(num, exp) num ## e ## exp
EXPONENT(1,1)
EXPONENT(1,-1)
EXPONENT(1,+1)
预处理后的变为:
1e1
1e- 1
1e+ 1
而不是
1e1
1e-1
1e+1
? 我怀疑它可能是因为-1,+ 1被解析为两个标记(?)。但是,在这种情况下如何获得后者的结果?
答案 0 :(得分:4)
你说得对,-1
和+1
是两个预处理令牌,因此只有第一个被粘贴到e
。
对我来说,
#define EXPO(num, sign, ex) num ## e ## sign ## ex
EXPO(1,,1)
EXPO(1,-,1)
EXPO(1,+,1)
使用gcc-4.5.1。
答案 1 :(得分:3)
我认为您遇到的问题被视为未定义的行为。每gcc 4.3.2 documentation on concatentation:
但是,不能同时形成有效令牌的两个令牌不能 贴在一起。例如,您无法将x与+ in连接 无论是订单。如果您尝试,预处理器会发出警告并发出警告 两个代币。是否在令牌之间放置空格是 未定义。在复杂中找到##的不必要用途是很常见的 宏。如果你收到这个警告,你可能很简单 删除`##'。
另请参阅有关SO的this answer,其中存在同样的问题。
编辑:
我设法让这个工作,但你需要两个宏+和 -
#define E(X) 1e-##X
int main()
{
double a = E(10); // expands to 1e-10
printf("%e", a);
return 0;
}
答案 2 :(得分:-1)
#include <stdio.h>
#include <stdlib.h>
#define EXPONENT(num, exp) atof(#num "e" #exp)
void main(){
double x = EXPONENT(1,-1);
printf("%f", x);
}