我发现很多问题和答案都是用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定义,而使用连接它是自动的
现在,这些例子非常简单,所以忘记它很困难,但是如果你有一个项目,这些东西分散在很多文件中,忘记一个变量很容易,并且会浪费很多时间
答案 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+)