【问题标题】:Initialize structs issues on C在 C 上初始化结构问题
【发布时间】:2012-08-10 14:26:45
【问题描述】:

我在编译期间收到此错误:

"c:\command_line.h(17): 错误 C2143: 语法错误: 缺少 ';'前 '*' 注意:C++ 不支持默认整数 command_line.h(17):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int"

这是我的代码:

command_line.h

typedef struct symbol
{
    char* sym_type;
    unsigned short address;
}symbol;


typedef struct symbol_map
{
    char** p_arr_keys;
    symbol* p_arr_values;
    int item_count;
    int array_mode;
    int copy_keys;
}symbol_map;

typedef struct params
{
    int data_counter;
    int code_counter;
    int line_counter;
    int command_len;
    int error_counter;
    int warning_counter;
    symbol_map* p_symbol_map; // (This is line 17- from the error msg)
    char* p_last_symbol
}params;

main.c

params config;
config.code_counter = 0;
config.data_counter = 0;
config.line_counter = 0;
config.command_len = 0;
config.command_first_char = EMPTY;
config.error_counter = 0;
config.warning_counter = 0;
config.p_last_symbol = NULL;
config.p_symbol_map = {NULL}; // (This is line 17- from the error msg)

知道这个初始化有什么问题吗?

 config.p_symbol_map = {NULL};

【问题讨论】:

  • 您的代码不匹配,struct params 中没有p_last_symbol。除此之外,为什么{} 围绕着NULL?它只是一个指针。
  • 这不是初始化,而是赋值。
  • 您说得对,缺少 p_last_symbol,我忘记将其添加到此处。但错误仍然存​​在
  • 问题发布后请不要改动太多,如果你更改了源代码,人们的答案将失效!

标签: c struct initialization


【解决方案1】:

您使用的构造config.p_symbol_map = {NULL} 是静态初始化,只允许在变量声明中使用。如果您想将 NULL 分配给 p_symbol_map,您可以简单地 config.p_symbol_map = NULL

应用于symbol 结构的静态初始化的有效情况如下:

symbol sym = {
   NULL,
   0x42
};

更新:

顺便说一句,您在结构定义中char* p_last_symbol 后面缺少分号。


typedef struct params
{
    int data_counter;
    int 
    int line_counter;
    int command_len;
    int error_counter;
    int warning_counter;
    symbol_map* p_symbol_map; // (This is line 17- from the error msg)
    char* p_last_symbol  <----- need to add ; here
}params; 
 

【讨论】:

    【解决方案2】:

    您不是在初始化结构,而是在初始化指向结构的指针。

    struct foo {
      int a;
      int b;
    };
    
    struct foo bar = {.a = 0, .b = 1};
    

    但是如果你声明一个指向它的指针,那么你一开始就没有要初始化的内存块。所以不能使用{} idiom 来初始化指向struct 的指针;

    struct foo *bar;
    bar = NULL
    

    【讨论】:

    • .a 结构成员指定语法是否有效 C++?我还以为是 C99 什么的。
    • 它的 c99 ...问题是关于 C 的。所以我推测用户有一个支持 c99 的现代编译器。
    • 编译器警告似乎表明 C++ 尽管有问题标签。
    【解决方案3】:

    那里出了点问题,你分配给p_last_symbol 成员,你没有在params 中声明。另外,p_symbol_map 是一个指向某个东西的指针,你可以用NULL 对其进行初始化,也可以让它指向其他东西(例如用malloc 分配的内存)。

    【讨论】:

      【解决方案4】:

      NULL 周围不需要{}。只需使用NULLnullptr 就可以了。此外,p_symbol_map 是什么?你的参数声明中没有这样的东西。 另外,在第 17 行,它应该写成:

      struct symbol_map* p_symbol_map。这就是第 17 行出现错误的原因。

      希望这会有所帮助。

      【讨论】:

      • 感谢您的快速解答。我试图将其更改为 NULL 并没有帮助。 p_symbol_map 是一个指向 struct symbol_map 的指针。我认为我不需要在第 17 行之前添加结构,因为结构已经被识别
      • 您是否尝试过使用关键字“struct”?试试看,让我知道它是否有效。
      【解决方案5】:

      你不能那样做。您必须初始化配置 AFAIK。您可以这样做,因为您分配的是指针而不是结构。

      config.p_symbol_map = NULL;
      

      【讨论】:

      • 错误是说编译器不知道 symbol_map 是什么。你确定你复制了 command_line.h 对吗?您放置结构定义的顺序很重要。此外,您正在使用 C++ 而不是 C 进行编译,因此不需要 typedef 习惯用法。您使用的是 C 还是 C++?。
      • 如果你打算使用 C++ 编译器,请尝试使用 typedef struct symbol_map { // 这里的其他东西... } symbol_map_t;
      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2020-09-23
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多