字符串在预处理器

时间:2018-03-24 15:08:36

标签: c++ c

我发现很多问题和答案都是用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

但请注意,这不是我想要做的;我希望在编译时执行连接。

这可能吗?或者定义是&#34;不可变&#34;?

这个问题不是关于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定义,而使用连接它是自动的

现在,这些例子非常简单,所以忘记它很困难,但是如果你有一个项目,这些东西分散在很多文件中,忘记一个变量很容易,并且会浪费很多时间

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

无法重新定义宏。任何完全符合您需求的内置解决方案都没有出现在我的脑海中,但是如何使用简单的正则表达式来生成所有条件的列表呢?

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

(STR_COND_\w+)