我已经读过很多关于字符串宏的文章,但我显然不太明白。 我希望创建一个字符串,其中需要首先计算宏的参数。 有人可以解释一下我哪里出错了,或者如何做得更好吗?
#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
的值在字符串化之前不需要转换为字符。
但是,如果您确实需要在字符串化之前执行计算,则应:
- 使用 cpp 的
constexpr
. - 向编译器供应商抱怨常量表达式未优化。
- 使用预处理器库来获得所需的行为。