结构声明中是否允许使用额外的分号?

时间:2018-03-28 08:02:24

标签: c gcc language-lawyer

这个问题仅仅是好奇心。关于空结构

我偶然发现了一个有趣的错字

struct {
     int member1; /*comment*/ ; /* <-- note the ';' */
     int member2;
} variable[] = { /* initializers */ };

编译器(xc32,派生自gcc)无任何接受 投诉。当然,我纠正了这个,但软件正在运行 在修正之前和之后顺利进行,并且看似额外的; 没有问题。然后,我在结构定义中尝试了;;;的各种长度,它们似乎对功能没有任何区别 也不是sizeof。所以struct ;;;;的任何序列似乎都是; 相当于一个;

我找不到关于结构/联合的这种“空成员”的任何内容 在规范中,既不允许它们也不允许它们存在 不允许。对我来说,似乎语法拒绝了他们。这与此形成对比 在编译单元的顶层“空声明”; 标准明确禁止和函数中的“空”语句 { "Name" : "Lila", "Files": [ { "Name": "File1", "Date" : "05-11-2017"}, { "Name": "File2", "Date" : "26-03-2018"} ] } 是一个 明确允许语言功能。

有没有人知道这种行为?它是编译器特定的还是 C规范以某种方式容忍这样的空结构成员?

2 个答案:

答案 0 :(得分:8)

语法在C11 6.7.2.1

中指定
  

结构声明:
    specifier-qualifier-list struct-declarator-listopt ;
    static_assert声明

最后有1个分号,因此这是唯一允许的语法。你不能跳过分号,你不能添加额外的分号。就是这样。

(但是你可以在C11中的结构声明中有一个静态断言。)

答案 1 :(得分:4)

标准没有谈到这一点,只是gcc容忍度。见6.7.2.1

struct-or-union-specifier:
              struct-or-union identifieropt { struct-declaration-list }
              struct-or-union identifier
struct-or-union:
             struct
             union
struct-declaration-list:
             struct-declaration
             struct-declaration-list struct-declaration
struct-declaration:
             specifier-qualifier-list struct-declarator-listopt ;
             static_assert-declaration
specifier-qualifier-list:
            type-specifier specifier-qualifier-listopt
            type-qualifier specifier-qualifier-listopt

type-specifiertype-qualifier不能为空,有关详细信息,请参阅标准中的相关部分。)

某些编译器(如gcc)可以容忍额外的分号,但-Wpedantic选项显示它只是一个容差:

struct foo {
    int a;
    ;;;
};

int main() {
    ;;;
}

使用-pedantic选项gcc会抱怨,而不是主空语句,而是结构声明的额外分号。

<source>:3:5: warning: extra semicolon in struct or union specified [-Wpedantic]
     ;;;
     ^
<source>:3:6: warning: extra semicolon in struct or union specified [-Wpedantic]
     ;;;
      ^
<source>:3:7: warning: extra semicolon in struct or union specified [-Wpedantic]
     ;;;

其他编译器可能不那么友好,所以拼写错误必须修复,因为它没有带来任何有用的东西。