【问题标题】:missing braces around initializer初始化器周围缺少大括号
【发布时间】:2011-09-05 01:18:22
【问题描述】:

编译器是 MPLAB 8 下的 GCC,dsPIC33 ver 3.30c

// Note: the first block below generates no error's with the compiler, but the data
//  in the structurer is wrong.
//  the 2nd block give warning, but the data is correct... why??
//      NMEA2000.c:289: warning: missing braces around initializer
//      NMEA2000.c:289: warning: (near initialization for 'static_can_filter[0]')

const tSCF static_can_filter[] = {
    {(uint32) 0x01FFFFFF}, {(uint8) 2}, // Filter 0 (Process data)
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 1       
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 2 (receive P2P-Message)
    {(uint32) 0x0000FF00}, {(uint8) 2}, // Filter 3 (receive P2P-Message)
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 4
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 5
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 6
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 7
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 8
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 9
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 10
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 11
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 12
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 13
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 14
    (uint32) 0x00000000}, {(uint8) 2}   // Filter 15
};


const tSCF static_can_filter[] = {
    (uint32) 0x01FFFFFF, (uint8) 2, // Filter 0 (Process data)
    (uint32) 0x00000000, (uint8) 2, // Filter 1       
    (uint32) 0x00000000, (uint8) 2, // Filter 2 (receive P2P-Message)
    (uint32) 0x0000FF00, (uint8) 2, // Filter 3 (receive P2P-Message)
    (uint32) 0x00000000, (uint8) 2, // Filter 4
    (uint32) 0x00000000, (uint8) 2, // Filter 5
    (uint32) 0x00000000, (uint8) 2, // Filter 6
    (uint32) 0x00000000, (uint8) 2, // Filter 7
    (uint32) 0x00000000, (uint8) 2, // Filter 8
    (uint32) 0x00000000, (uint8) 2, // Filter 9
    (uint32) 0x00000000, (uint8) 2, // Filter 10
    (uint32) 0x00000000, (uint8) 2, // Filter 11
    (uint32) 0x00000000, (uint8) 2, // Filter 12
    (uint32) 0x00000000, (uint8) 2, // Filter 13
    (uint32) 0x00000000, (uint8) 2, // Filter 14
    (uint32) 0x00000000, (uint8) 2  // Filter 15
};

【问题讨论】:

    标签: gcc mplab


    【解决方案1】:

    假设 tSCF 定义如下:

    typedef struct tSCF {
      uint32 a;
      uint8 b;
    } tSCF;
    

    你想要的可能如下所示:

    const tSCF static_can_filter[] = {
        { (uint32) 0x01FFFFFF, (uint8) 2 }, // Filter 0 (Process data)
        { (uint32) 0x00000000, (uint8) 2 }, // Filter 1
        [...]
    

    每个带大括号的初始化器都会初始化数组的不同元素。您的问题{(uint32) 0x01FFFFFF}, {(uint8) 2}, 中的第一种形式最终构建了数组的两个成员(每个成员都将a 设置为给定值,b 设置为零)。您可以通过添加显式数组绑定来在示例中看到这一点(这将导致编译器抱怨过多的初始化程序。

    您问题的第二种形式完全符合您的要求:当没有任何大括号并且数组元素是结构时,值将分配给连续的字段。这里有一个可选的警告(可能用-Wall 或类似的东西打开),因为这个答案中给出的表格让你的意图更清楚了。

    【讨论】:

      【解决方案2】:

      您似乎错过了此行开头的{

      (uint32) 0x00000000}, {(uint8) 2}   // Filter 15
      

      【讨论】:

      • 他在代码中承认这一点(见顶部的评论)
      【解决方案3】:

      可能是文件中较高的未闭合大括号......我们需要在上下文中看到这一点 - 单独放入一个文件,您的第二个数组编译得很好。我使用查找和替换更改了类型,这不会产生任何错误或警告

      gcc -c -Wall -Wextra
      

      所以,错误一定在其他地方。

      #include <stdint.h>
      const uint32_t static_can_filter[] = {
          (uint32_t) 0x01FFFFFF, (uint8_t) 2, // Filter 0 (Process data)
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 1       
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 2 (receive P2P-Message)
          (uint32_t) 0x0000FF00, (uint8_t) 2, // Filter 3 (receive P2P-Message)
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 4
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 5
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 6
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 7
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 8
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 9
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 10
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 11
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 12
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 13
          (uint32_t) 0x00000000, (uint8_t) 2, // Filter 14
          (uint32_t) 0x00000000, (uint8_t) 2  // Filter 15
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 2012-11-24
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多