【发布时间】:2018-03-24 23:55:30
【问题描述】:
我发现了很多用 C 或 C++ 预处理器连接字符串的问题和答案;例如this question(但还有更多)。
我找不到的是是否可以连接到同一个字符串。更清楚地说,是这样的
#define MY_STRING "Hello"
#define MY_STRING MY_STRING " world"
// Now MY_STRING is "Hello world"
如果我必须在“运行时”期间编写它,我会写类似
char my_string[80];
strcpy(my_string, "Hello");
strcat(my_string, " world"); // <- similar to this operation, but in preprocessor
但是请注意,这不是我想要做的;我希望在编译时执行连接。
这可能吗?还是定义是“不可变的”?
这个问题与 C 或 C++ 的特定风格无关;如果这只能用两种语言中的一种或只能用某些特定的编译器来实现,请在答案中指定它
编辑:正如 Lightness Races in Orbit 部分猜测的那样,我的问题主要围绕条件编译以及可扩展性展开。
至于条件编译,我目前做的是
#if COND_1
#define STR_COND_1 " val1"
#else
#define STR_COND_1 ""
#endif
#if COND_2
#define STR_COND_2 " val2"
#else
#define STR_COND_2 ""
#endif
#define STR STR_COND_1 STR_COND_2
这里的问题是,当条件变得太多时,这会导致错误(很容易忘记一个),而串联则没有这个问题。
至于可扩展性,我的意思是如果我必须添加另一个将其字符串添加到 STR 的模块(例如,COND_3),我必须手动将其添加到 STR 定义中,而通过连接它是自动的.
现在,这些例子真的很简单,所以忘记它是很困难的,但是当你有一个项目时,这些东西分散在很多文件中,忘记一个变量很容易,而且会浪费很多时间
【问题讨论】:
-
只需使用
const std::string s = "Hello World"并继续捕捉更大更好的鱼。 -
@Ron 也许我不够清楚,但我不希望它在程序期间完成,而是在编译时......而且你可以将 s 连接到其他字符串吗?跨度>
-
@Ron:这个问题是有效的。世界并不都围绕运行时的动态分配。预处理器是一个有用的工具,可以提出有关它的问题。
-
这个答案的第二部分有一个绝妙的技巧:stackoverflow.com/a/46019437/1566221