8

为什么要编码:

#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 被解析为两个标记(?)。但是,在那种情况下如何获得后者的结果呢?

4

3 回答 3

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。

于 2012-07-12T14:37:13.907 回答
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;
}
于 2012-07-12T14:35:11.007 回答
-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);
}
于 2012-07-12T15:18:25.980 回答