我发现了很多使用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++的特定风格无关。如果只能使用两种语言之一或仅使用某些特定的编译器来实现,请在答案中进行指定
编辑:正如《轨道轻度竞赛》部分猜中的那样,我的问题的重点围绕条件编译以及可扩展性。
至于条件编译,我目前正在做的是
#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定义,而使用串联是自动的。
现在,这些示例确实很简单,因此很难忘记,但是当您有一个项目将这些东西分散在许多文件中时,忘记一个变量很容易,并且可能导致大量时间的浪费。
最佳答案
You can't redefine a preprocessor macro。所以不行。
如果您不介意一次完成所有操作,则可以将两个文字串联起来,这样:
#define MY_STRING "hello" " world"
或使用其他名称。这是一个示例,介绍一个有条件的,因为我期望这是您从问题中忽略的真正问题的症结所在:
#define MY_STRING_BASE "hello"
#ifdef FOO
#define MY_STRING MY_STRING_BASE " world"
#else
#define MY_STRING MY_STRING_BASE
#endif
关于c++ - 字符串在预处理器中串联为self,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49466267/