Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;可以在字符串上使用预处理器吗?_C++_String_C Preprocessor - Fatal编程技术网

C++ C++;可以在字符串上使用预处理器吗?

C++ C++;可以在字符串上使用预处理器吗?,c++,string,c-preprocessor,C++,String,C Preprocessor,预处理器可用于使用#define将某些关键字替换为其他关键字。例如,我可以做#定义名称“George”,每次预处理器在程序中找到“name”时,它都会将其替换为“George” 然而,这似乎只适用于代码。我如何使用字符串和文本来实现这一点?例如,如果我在屏幕上打印“Hello I am name”,我希望将“name”替换为“George”,即使它是字符串而不是代码 我不想手动搜索字符串中的关键字,然后替换它们,而是想使用预处理器来切换单词 这可能吗?如果是,怎么做 我使用C++,C解决方案也是

预处理器可用于使用
#define
将某些关键字替换为其他关键字。例如,我可以做
#定义名称“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++标准中添加引号。感谢@MatteoItalia提供的C++11引号。

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

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

#include <iostream>

#define name "George"

int main(int argc, char** argv) {
    std::cout << "Hello I am " << name << std::endl;
}
#包括
#定义名称“乔治”
int main(int argc,字符**argv){
标准::cout

此处名称将替换为“George”

这在C中完全有效,实现必须编译它。我更喜欢
print(“%s”,“你好,我是“name”\n”);
。但无论如何,+1表示串联。@AaronMcDaid:更简单:
put(“你好,我是“name”);
。它保证工作正常,这是标准规定的:“在翻译阶段6(2.2),相邻的字符串文本被连接。”(C++11,[lex.string]^13)请注意,连接不是由预处理器完成的,而是由处理器完成的(预处理器在阶段4结束其工作)。@AaronMcDaid hello world的规范K&R版本是
printf(“hello,world”);
不是
printf(%s\n“,”你好,世界“;
#define name "George"

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