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

时间:2012-01-22 23:25:19

标签: c++ string c-preprocessor

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

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

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

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

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

3 个答案:

答案 0 :(得分:15)

#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 ++标准的引号。感谢@MatteoItalia提供的C ++ 11报价。

答案 1 :(得分:7)

#define name "George"

printf("Hello I am %s\n", name); 

此处的名称将替换为“George”

答案 2 :(得分:3)

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

所以你必须使用像printf这样的函数或变量而不是预处理器,或者像这样从字符串中拉出令牌:

#include <iostream>

#define name "George"

int main(int argc, char** argv) {
    std::cout << "Hello I am " << name << std::endl;
}