C ++定义宏可以将浮点文字重写为双字面值,还是至少删除后缀?

时间:2017-07-14 14:08:24

标签: c++ macros

#ifdef DOUBLE_PRECISION_COMPUTE
    #define MAKE_PRECISE(N) ...
#endif
// if not defined, leave as it is. MAKE_PRECISE(N) (N)

上面的宏(取代" ......"右边的redifiniton)可以进行以下操作吗?

double PI=MAKE_PRECISE(3.14159265359f);

变为

double PI=3.14159265359;

double area= MAKE_PRECISE(3.14159265359f)*r*r;

变为

double area= 3.14159265359*r*r;

2 个答案:

答案 0 :(得分:6)

没有

无法使用预处理程序指令转换令牌。

相反,请删除源代码中的f来更正文字。

无论如何,结果将比在一些MAKE_PRECISE宏中包装所有内容更容易阅读,但不清楚发生了什么。

答案 1 :(得分:2)

如上所述,您无法删除f,但您可以有条件地添加它:

#ifdef DOUBLE_PRECISION_COMPUTE
#   define MAKE_PRECISE(N) (N)
#else
#   define MAKE_PRECISE(N) (N##f)
#endif

将转向:

double area = MAKE_PRECISE(3.14159265359)*r*r;

进入:

double area = (3.14159265359)*r*r;   // with DOUBLE_PRECISION_COMPUTE defined

double area = (3.14159265359f)*r*r;  // with DOUBLE_PRECISION_COMPUTE UNdefined