C 字符串化方程的结果



我已经读过很多关于字符串宏的文章,但我显然不太明白。 我希望创建一个字符串,其中需要首先计算宏的参数。 有人可以解释一下我哪里出错了,或者如何做得更好吗?

#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">

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

这意味着在字符串化之前不会计算方程;相反,预处理器将只字符串化整个方程。

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

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

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

最新更新