为什么要编码:
#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 被解析为两个标记(?)。但是,在那种情况下如何获得后者的结果呢?
为什么要编码:
#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 被解析为两个标记(?)。但是,在那种情况下如何获得后者的结果呢?
你是对的,-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。
我认为您遇到的问题被认为是未定义的行为。根据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;
}
#include <stdio.h>
#include <stdlib.h>
#define EXPONENT(num, exp) atof(#num "e" #exp)
void main(){
double x = EXPONENT(1,-1);
printf("%f", x);
}