是否可以在纯 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 */ 
  ... 
}

您有多个问题:

  1. 您想创建一个初始化列表。对于数组,这必须如下所示:int arr[] = { ... } 而您的替换文本将所有内容都放在额外的括号 ({ ... }) 中。这只会产生一个单一的值,而不是一个数组。

  2. 在宏中,通过将 \ 作为行中的最后一个字符,可以在下一行继续替换。之后没有字符(也没有评论)。

  3. 当您想要初始化具有常量维度的普通数组时,会出现上述问题。 您拥有的是一个可变长度数组 (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]);
    }
  }
}