是否可以在纯 C 中使用#define 指令定义 multidim 数组?
is it possible to define multidim arrays with #define directive in pure C?
我想与计算代码分开管理我的字符串常量包。 我想在单独的文件中完成。
所以,我需要创建一个 multidim 字符串数组并在 STR_PACK_X
下结束它。
如果可能的话,任何人都可以使用 #define
multidim-string-constants 语法正确地引导我吗?
请帮帮我,这个尝试有什么问题:
#define STR_PACK_X \
({ \
\ // comm1
{ "string1", "string2", "string3" }, \
\ // comm2
{ "string11", "string22", "string33" }, \
\ // comm3
{ "string111", "string222", "string333" } \
})
我想这样使用它:
int line_lim = 4, word_lim = 4, char_lim = 50;
if (flag1)
{
char array[line_lim][word_lim][char_lim] = STR_PACK_1;
/* array processing */
...
}
if (flag2)
{
char array[line_lim][word_lim][char_lim] = STR_PACK_2;
/* array processing */
...
}
您有多个问题:
您想创建一个初始化列表。对于数组,这必须如下所示:int arr[] = { ... }
而您的替换文本将所有内容都放在额外的括号 ({ ... })
中。这只会产生一个单一的值,而不是一个数组。
在宏中,通过将 \
作为行中的最后一个字符,可以在下一行继续替换。之后没有字符(也没有评论)。
当您想要初始化具有常量维度的普通数组时,会出现上述问题。
您拥有的是一个可变长度数组 (VLA)。这些根本无法初始化。
如前所述,您在此处存在多项语言违规行为:
- 初始化列表周围的括号无效,它为您希望实现的目标提供了错误的语法。
- 您无法初始化 variable-length 数组。
- 您不能在
\
换行之后放置字符,将 //
注释与它们一起使用总是有问题的。我建议将所有 \
缩进到固定源列。
您似乎更愿意使用 复合文字 ,然后从 run-time 中复制该文字的内容:
#include <stdio.h>
#include <string.h>
#define STR_PACK_X \
(const char* [3][3]) \
{ \
{ "string1", "string2", "string3" }, /* comm1 */ \
{ "string11", "string22", "string33" }, /* comm2 */ \
{ "string111", "string222", "string333" }, /* comm3 */ \
}
int main (void)
{
int line_lim = 4, word_lim = 4, char_lim = 50;
char array[line_lim][word_lim][char_lim]; // VLA, can't be initialized
for(size_t i=0; i<3; i++)
{
for(size_t j=0; j<3; j++)
{
strcpy(array[i][j], STR_PACK_X[i][j]);
puts(array[i][j]);
}
}
}
我想与计算代码分开管理我的字符串常量包。 我想在单独的文件中完成。
所以,我需要创建一个 multidim 字符串数组并在 STR_PACK_X
下结束它。
如果可能的话,任何人都可以使用 #define
multidim-string-constants 语法正确地引导我吗?
请帮帮我,这个尝试有什么问题:
#define STR_PACK_X \
({ \
\ // comm1
{ "string1", "string2", "string3" }, \
\ // comm2
{ "string11", "string22", "string33" }, \
\ // comm3
{ "string111", "string222", "string333" } \
})
我想这样使用它:
int line_lim = 4, word_lim = 4, char_lim = 50;
if (flag1)
{
char array[line_lim][word_lim][char_lim] = STR_PACK_1;
/* array processing */
...
}
if (flag2)
{
char array[line_lim][word_lim][char_lim] = STR_PACK_2;
/* array processing */
...
}
您有多个问题:
您想创建一个初始化列表。对于数组,这必须如下所示:
int arr[] = { ... }
而您的替换文本将所有内容都放在额外的括号({ ... })
中。这只会产生一个单一的值,而不是一个数组。在宏中,通过将
\
作为行中的最后一个字符,可以在下一行继续替换。之后没有字符(也没有评论)。当您想要初始化具有常量维度的普通数组时,会出现上述问题。 您拥有的是一个可变长度数组 (VLA)。这些根本无法初始化。
如前所述,您在此处存在多项语言违规行为:
- 初始化列表周围的括号无效,它为您希望实现的目标提供了错误的语法。
- 您无法初始化 variable-length 数组。
- 您不能在
\
换行之后放置字符,将//
注释与它们一起使用总是有问题的。我建议将所有\
缩进到固定源列。
您似乎更愿意使用 复合文字 ,然后从 run-time 中复制该文字的内容:
#include <stdio.h>
#include <string.h>
#define STR_PACK_X \
(const char* [3][3]) \
{ \
{ "string1", "string2", "string3" }, /* comm1 */ \
{ "string11", "string22", "string33" }, /* comm2 */ \
{ "string111", "string222", "string333" }, /* comm3 */ \
}
int main (void)
{
int line_lim = 4, word_lim = 4, char_lim = 50;
char array[line_lim][word_lim][char_lim]; // VLA, can't be initialized
for(size_t i=0; i<3; i++)
{
for(size_t j=0; j<3; j++)
{
strcpy(array[i][j], STR_PACK_X[i][j]);
puts(array[i][j]);
}
}
}