我正在尝试执行以下操作:
#define mkstr(str) #str
#define cat(x,y) mkstr(x ## y)
int main()
{
puts(cat(\,n));
puts(cat(\,t))
return 0;
}
两个 puts
语句都会导致错误。由于 \n
和 n
都是预处理器标记,我希望在那些 puts
语句中正确输出它们,但是 Bloodshed/DevC++ 编译器给我以下错误:
24:1 G:\BIN\cLang\macro2.cpp pasting "\" and "n" does not give a valid preprocessing token
我遗漏的事实在哪里?
最佳答案
预处理器使用需要 C 语言输入的分词器。因此,即使在进行字符串化时,您也不能将随机垃圾传递给宏。 ==> 不要让你的预处理器难过 - 如果你这样做太频繁它会吃小猫。
实际上,无法通过编译时连接创建 "\n"
,因为 "\\""n"
是由两个文字组成的字符串,即“\n”。
关于c - 如何使用 ## 运算符通过宏扩展生成字符串或字符常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247348/