C 编译时数组串联

C 编译时数组串联,c,C,C支持在编译时连接常量字符串。我可以对任何常量数组执行相同的操作吗?(例如,连接两个字符**数组。)简短回答:否 简短回答:字符串文字确实是字符数组,但并非所有字符数组都是字符串文字。编译时串联仅适用于字符串文本。没有任何数组具有这种“功能”。基本上没有,但是您可以使用预处理器解决这个问题。诀窍是定义不带花括号的数组: #define ARRAY_ONE "test1", "test2", "test3" #define ARRAY_TWO "testa", "testb", "testc"

C支持在编译时连接常量字符串。我可以对任何常量数组执行相同的操作吗?(例如,连接两个字符**数组。)

简短回答:否


简短回答:字符串文字确实是字符数组,但并非所有字符数组都是字符串文字。编译时串联仅适用于字符串文本。没有任何数组具有这种“功能”。

基本上没有,但是您可以使用预处理器解决这个问题。诀窍是定义不带花括号的数组:

#define ARRAY_ONE "test1", "test2", "test3"
#define ARRAY_TWO "testa", "testb", "testc"
现在,您可以在编译时使用逗号连接数组。 但是,要使用它们,必须使用大括号或宏对其进行排序:

#define ARR(...) {__VA_ARGS__}
现在,您可以使用单个数组或所需的任何串联,如下所示:

char *arr1[] = ARR(ARRAY_ONE);
char *arr2[] = ARR(ARRAY_TWO);
char *arrc1[] = ARR(ARRAY_ONE, ARRAY_TWO);
char *arrc2[] = ARR(ARRAY_ONE, ARRAY_TWO, ARRAY_ONE, ARRAY_ONE);

但是,使用宏来获得这样的结果是一种不好的做法。

为什么你声称以这种方式使用宏是一种不好的做法?我基本上认为使用改变语法的宏总是一种不好的做法,因为它很容易出错。这并不意味着人们不应该使用它们,因为这就是它们的用途。如果你知道自己在做什么,一切都是好的;)啊,你的观点是
ARR(ARRAY\u-ONE,ARRAY\u-TWO)
读起来像一个由两个元素组成的数组,而实际上它有六个元素。避免这种混淆是绝对重要的;我建议添加列表作为标识符的一部分,以明确它扩展到多个元素,例如,
char*arrc1[]={ARRAY\u one\u LIST,ARRAY\u TWO\u LIST}