【问题标题】:GCC array of struct compiler weirdness结构编译器怪异的GCC数组
【发布时间】:2009-08-29 18:27:05
【问题描述】:

我好久没用C了。这是怎么回事?

wOCR.c:8:错误:在“.”标记之前应有“=”、“,”、“;”、“asm”或“__attribute__” wOCR.c:9:错误:在“.”标记之前应有“=”、“,”、“;”、“asm”或“__attribute__” 在这段代码上: 结构 wOCR_matchGrid { 字符; 整数 * 数据; }; 结构 wOCR_matchGrid alphaMatch[26]; alphaMatch[0].character = 'A'; /*8*/ alphaMatch[0].data = { /*9*/ 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1 };

【问题讨论】:

  • 您不能将任意 C 代码放在函数之外。

标签: gcc


【解决方案1】:

首先,您应该在函数体内执行此操作。然后,使用大括号的语法是非法的,因为您将它们分配给指针,而不是数组或结构。该语法也仅在初始化时有效,在赋值期间无效。

代码可能使用了复合文字,一些程序员删除了必要的类型名称:

void some_function(void) {
    struct wOCR_matchGrid alphaMatch[26];

    alphaMatch[0].character = 'A'; /*8*/
    alphaMatch[0].data = (int[]){         /*9*/
                         0, 1, 0,
                         1, 0, 1,
                         1, 1, 1,
                         1, 0, 1   
                         };

};

注意我添加的带括号的int[]。这将告诉 GCC 创建一个在该函数调用的生命周期内存在的未命名数组,并将其地址分配给 .data 指针。在这种情况下,这 不是 强制转换,但它对于这种语法的工作和创建数组复合文字是必不可少的。然而,这些复合文字是 C99 的一项特性,并非在每个编译器中都有效。

【讨论】:

  • 当然,复合文字不适用于所有编译器(尤其是 MSVC 不适用!),但它们在 GCC 中确实有效,除非您告诉它不允许使用 -std=c89 或类似选项。
【解决方案2】:

你应该在函数体内做这些赋值。

【讨论】:

    【解决方案3】:

    你可以这样做,但它是一团糟:

    struct wOCR_matchGrid {
      char character;
      int data[12];
    };
    
    struct wOCR_matchGrid alphaMatch[26] = 
    {
      {'A', {0, 1, 0,
               1, 0, 1,
               1, 1, 1,
               1, 0, 1}},
       {'B', {0, 1, 0,
               1, 0, 1,
               1, 1, 1,
               1, 0, 1}},
       /* etc */
    };
    

    请注意,在这种情况下,数据不能任意调整大小。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多