C对等式

时间:2017-07-24 02:22:47

标签: c c-preprocessor

我已经阅读了许多关于字符串化宏的内容,但我显然不太明白。我希望创建一个字符串,其中需要首先评估宏的参数。有人可以解释我出错的地方,或者可能更好地做到这一点吗?

#define SDDISK          2     // Note defined in a library file elsewhere ie not a constant I know)

#define DRIVE_STR(d)    #d ":/"
#define xDRIVE_STR(x)   DRIVE_STR(x)
#define FILEPATH(f)     xDRIVE_STR(SDDISK + '0') #f

const char file[] = FILEPATH(test.log);

void main(void)
{
    DebugPrint(file);
}

输出为:“2 +'0':/ test.log”,
但我想要“2:/test.log”

1 个答案:

答案 0 :(得分:0)

C预处理器在编译器看到代码之前运行。

这意味着在进行字符串化之前不会对等式进行求值;相反,预处理器只会将整个方程式字符串化。

在您的情况下,只删除+'0'将解决问题,因为SDDISK的值在字符串化之前不需要转换为char。

但是,如果您确实需要在字符串化之前执行计算,则应该:

  1. 使用cpp' constexpr
  2. 向您的编译器供应商抱怨未对常量表达式进行优化。
  3. 使用预处理器库来获得想要的行为。