字符串在预处理器中连接到 self

String concatenate to self in preprocessor

本文关键字:连接 self 处理器 预处理 字符串      更新时间:2023-10-16

我发现很多问题和答案将字符串与C或C++预处理器连接起来;例如这个问题(但还有更多)。

我找不到的是是否可以连接到同一个字符串。更清楚的是,像这样的事情

#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 定义中,而使用串联它是自动的。

现在,这些例子真的很容易,所以忘记它是困难的,但是当你有一个项目,这些东西分散在很多文件中时,忘记一个变量很容易,并可能导致浪费大量时间。

不能重新定义预处理器宏。所以,没有。

如果您不介意一次性完成所有操作,则可以连接两个文本

#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

无法重新定义宏。我不会想到任何完全适合您需求的内置解决方案,但是使用简单的正则表达式来生成所有条件的列表呢?

假设每个条件宏都以STR_COND_开头,则对所有文件运行正则表达式将生成所有条件的列表:

(STR_COND_w+)