我正在尝试执行以下操作:
#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粘贴“\”和“n”没有给出有效的预处理令牌
我失踪的事实在哪里?
答案 0 :(得分:3)
预处理器使用一个需要C-ish输入的标记器。因此,即使在进行字符串化时,也无法将随机垃圾传递给宏。 ==>不要让你的预处理器感到悲伤 - 如果你经常这样做会吃小猫。
实际上,由于"\n"
是由两个文字组成的字符串,即“\ n”,因此无法通过编译时连接创建"\\" "n"
。