我发现了很多使用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/

10-13 07:34