C / C ++预处理器:如何根据参数的数量生成代码

时间:2012-11-09 10:40:48

标签: fortran c-preprocessor variadic-macros

我希望能够在我的预处理器宏

中执行此操作
#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);

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

2 个答案:

答案 0 :(得分:0)

如果您正在使用static_cast - 您已经在C ++世界中,那么您可以使用double(x)。所以定义dble double会起作用。

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

答案 1 :(得分:0)

预处理器可以处理不同数量的参数,但是这样的实现有点棘手,特别是对于区分0和一些参数的情况。在P99我有C99的宏,如果你对C ++更感兴趣(没有像C / C ++这样的东西,BTW)可以看一下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))

但这将是对自身权利的贬低。