2

我希望能够在我的预处理器宏中执行此操作

#define dble double
/* Just something that converts x to a double precision float. 
   static_cast used as an illustration: */
#define dble(x) static_cast<double>(x)

我知道 C 标准预处理器不允许重载。我也知道可变参数

#define dble(...) 

至少需要一个参数,并且不允许省略括号。即使有这样的洞察力,我也不能放弃它必须是解决这个问题的一种方法的感觉。有没有人有任何聪明的想法如何做到这一点?

使用示例:

dble x;
x = dble(3);

背景:我实际上对将 C 预处理器用于我的 Fortran 代码很感兴趣。我想为变量声明开发一个简化的符号。对于独立应用程序,DBLE 将扩展到 DOUBLE PRECISION,如果我正在为具有 C 接口的库进行 C 互操作性编译,则 DBLE 将扩展到 REAL(C_DOUBLE)。但是,DBLE 在 Fortran 中是所谓的 INTRINSIC。DBLE(3) 将 3 转换为双精度浮点数。在独立模式下,它将是 3.0d0。在 C 互操作模式下,它将被转换为 3.0_C_DOUBLE。

4

2 回答 2

0

预处理器可以处理不同数量的参数,但是这种东西的实现有点棘手,特别是在区分0和一些参数的情况下。在P99中,我有 C99 的宏,如果您对 C++ 更感兴趣(没有像 C/C++ 之类的东西,顺便说一句),请查看 boost。

使用 P99 你可以做这样的事情

#define dble(...) P99_IF_LT(P99_NARG(__VA_ARGS__), 1)(double)(static_cast_double(__VA_ARGS__))

对于 C99,我将使用复合文字来替换 C++'static_cast

#define static_cast_double(X) ((double){ 0 } = (X))

但这将是对其自身权利的剥夺。

于 2012-11-09T12:23:02.907 回答
0

如果您使用的是 static_cast - 您已经在 C++ 世界中,它允许您使用 double(x)。所以定义 dble double 将起作用。

对于更复杂的情况 - 好吧,cpp 并不是为了处理这个问题而设计的。也许另一个结合正则表达式的预处理器可能会有所帮助。

于 2012-11-09T11:53:03.187 回答