c - 如何使用 ## 运算符通过宏扩展生成字符串或字符常量

标签 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 pasting "\" and "n" does not give a valid preprocessing token

我遗漏的事实在哪里?

最佳答案

预处理器使用需要 C 语言输入的分词器。因此,即使在进行字符串化时,您也不能将随机垃圾传递给宏。 ==> 不要让你的预处理器难过 - 如果你这样做太频繁它会吃小猫。

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

关于c - 如何使用 ## 运算符通过宏扩展生成字符串或字符常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247348/

相关文章:

c - 获取变量的当前日期

c++ - 如何分配具有执行权限的内存?

c - 如何定义一个函数并在一个宏中使用它?

python - 如何将字符串拆分为标记?

token - 如何验证企业 Hashicorp 金库中 LDAP 用户的 token

c - fgets()/scanf() do-while 循环

c - 提取 int 二进制表示的最后四位数字

linux - Collectd 未登录 Splunk

c - 带有格式化错误跟踪的日志宏

c - "Overloading"具有 `#define` 常量的宏