连接C字符串在一行中没有定义

连接C字符串在一行中没有定义

问题描述:

在编译时是否有C++方式连接两个constexpr C字符串?我知道如何用C语言来定义它,但是真的会有C++的范围缩减和显式类型系统。我的主要目标是在编译时以一行连接字符串。连接C字符串在一行中没有定义

这里是什么样的方式工作,我不想没有一个例子:

#define STR1 "foo" 
#define STR2 "blah" 
#define CONCATED STR1 STR2 

这里有什么不工作方式的一个例子,我确实想:

constexpr const char *str1 = "foo"; 
constexpr const char *str2 = "blah"; 
constexpr const char *concated = str1 str2; 
+0

这个答案似乎是在正确的方向:https://*.com/questions/2978259/programmatically-create-static-arrays-at-compile-time-in-c 我的模板foo不但是,似乎要尽量减少鼻烟。我尝试使用constexpr函数还没有导致答案。 – mfdeakin

它只能在编译时使用字符串文字来完成。

constexpr const char concatenated[] = "foo" "blah"; 

这是所取得的效果您CONCATED宏(事实上,它是预处理器字面上如何扩大了宏观的使用)。

如果要连接命名变量,那么在编译时就不可能满足要求进行串联的要求,从而避免使用堆或堆栈。

两个明显的选择是分配足够的内存来保存结果,然后使用strcat()或使用std::string类型。这两者都涉及使用堆或堆栈(取决于您如何分配内存以及您为std::string选择的分配器如何工作),并且都在运行时进行连接。

+1

它不依赖于编译器。 '&“foo”“blah”'保证在您的程序生命中保持有效,这将排除堆栈分配。 – MSalters

+0

你在混合概念,MSalters。堆栈本身的概念与字符串文字的生存期无关。 – Peter

+1

我同意这条评论。但是你在回答中说,根据编译器的不同,字符串文字“foo”“blah”'可能会使用堆栈。答案的这一部分是不正确的。堆栈帧的生命周期只是函数调用的持续时间,但字符串文字的生命周期是整个进程的持续时间。 – MSalters