如何在字符串上使用C++预处理器?

fdh*_*fdh 3 c++ string c-preprocessor

预处理器可用于使用其他单词替换某些关键字#define.例如,我可以这样做,#define name "George"并且每次预处理器在程序中找到"名称"时,它将用"George"替换它.

但是,这似乎只适用于代码.我怎么能用字符串和文本做到这一点?例如,如果我在屏幕上打印"Hello I am name",我希望'name'替换为"George",即使它是在字符串而不是代码中.

我不想手动搜索字符串中的关键字,然后替换它们,而是想要使用预处理器来切换单词.

这可能吗?如果是这样的话?

我正在使用C++,但C解决方案也是可以接受的.

oua*_*uah 15

#define name "George"

printf("Hello I am " name "\n");
Run Code Online (Sandbox Code Playgroud)

相邻的字符串文字在C和C++中连接在一起.

C和C++标准引用:

对于C(引用C99,但C11在6.4.5p5中有类似的东西):

(C99,6.4.5p5)"在翻译阶段6中,由任何相邻字符序列和相同前缀字符串文字标记指定的多字节字符序列被连接成单个多字节字符序列."

对于C++:

(C++ 11,2.14.5p13)"在翻译阶段6(2.2)中,相邻的字符串文字被连接起来."

编辑:根据要求,添加C和C++标准的引号.感谢@MatteoItalia提供的C++ 11报价.

  • 这在C中完全有效,并且实现必须编译它. (13认同)
  • 它保证了它的工作原理,它是由标准规定的:"在翻译阶段6(2.2)中,相邻的字符串文字被连接起来." (C++ 11,[lex.string]13)请注意,串联不是由预处理器完成的,而是由处理器完成的(预处理器在第4阶段结束其工作). (5认同)
  • @AaronMcDaid规范的K&R版本的hello world是`printf("hello,world");`不是`printf("%s \n","hello,world");`. (2认同)

Hun*_*len 7

#define name "George"

printf("Hello I am %s\n", name); 
Run Code Online (Sandbox Code Playgroud)

这里的名字将被"乔治"取代