如何使用##运算符进行宏扩展的字符串或字符常量

时间:2012-06-28 14:55:16

标签: c macros token c-preprocessor stringification

我正在尝试执行以下操作:

#define mkstr(str) #str
#define cat(x,y) mkstr(x ## y)

int main()
{

   puts(cat(\,n));
   puts(cat(\,t))
   return 0;
}

两个puts语句都会导致错误。由于\nn都是预处理器令牌,我希望在那些puts语句中正确输出它们,但Bloodshed / DevC ++编译器给出了以下错误:

  

24:1 G:\ BIN \ cLang \ macro2.cpp粘贴“\”和“n”没有给出有效的预处理令牌

我失踪的事实在哪里?

1 个答案:

答案 0 :(得分:3)

预处理器使用一个需要C-ish输入的标记器。因此,即使在进行字符串化时,也无法将随机垃圾传递给宏。 ==>不要让你的预处理器感到悲伤 - 如果你经常这样做会吃小猫。

实际上,由于"\n"是由两个文字组成的字符串,即“\ n”,因此无法通过编译时连接创建"\\" "n"