C++预处理器如何用于字符串

How can the C++ Preprocessor be used on strings?

本文关键字:用于 字符串 何用于 预处理 处理器 C++      更新时间:2023-10-16

预处理器可用于使用#define将某些关键字替换为其他单词。例如,我可以执行#define name "George",每次预处理器在程序中找到"name"时,它都会将其替换为"George"。

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

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

这可能吗?如果是,怎么办?

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

#define name "George"
printf("Hello I am " name "n");

在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++标准中的引号。感谢@MatteoTalia对C++11的引用。

#define name "George"
printf("Hello I am %sn", name); 

此处的名称将替换为"George"

您的问题是预处理器不会(明智地)替换字符串文本中的标记。

因此,您必须使用类似printf的函数或变量而不是预处理器,或者从字符串中提取令牌,如:

#include <iostream>
#define name "George"
int main(int argc, char** argv) {
    std::cout << "Hello I am " << name << std::endl;
}