我希望能够在我的预处理器宏
中执行此操作#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。
答案 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))
但这将是对自身权利的贬低。