使用C预处理器连接以指数表示法获取数字

时间:2012-07-12 13:40:51

标签: concatenation c-preprocessor

为什么代码:

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

3 个答案:

答案 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);
}