c - 结构声明中是否允许额外的分号?

标签 c gcc language-lawyer

这个问题纯粹是出于好奇。 不是空结构。

我刚刚偶然发现了一个有趣的拼写错误

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

编译器(xc32,派生自 gcc)没有任何接受 投诉。当然,我更正了这个,但软件正在运行 修正前后顺利,加上;貌似 没有问题。然后我在结构定义中尝试了各种长度的 ;;; 它们似乎对功能没有影响 也不是 sizeof。所以在 struct 中,;;;; 的任何序列似乎都是 相当于单个 ;.

我找不到任何关于结构/union 的“空成员”的信息 在规范中,既不允许也不允许 不允许。在我看来,语法似乎拒绝了它们。这对比 到编译单元顶层的“空声明”;,其中 标准明确禁止函数中的“空”语句 ; 明确允许的语言功能。

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

最佳答案

语法在 C11 6.7.2.1 中指定

struct-declaration:
specifier-qualifier-list struct-declarator-listopt ;
static_assert-declaration

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

(但是,您可以在 C11 的结构声明中使用静态断言。)

关于c - 结构声明中是否允许额外的分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49529130/

相关文章:

c - 输入空格

python - 条件语句在不同的语言中表现不同

linux - 我们可以使用 __libc_stack_end 来确定 linux 上的堆栈结束吗?

c - 可以为 scanf ("%x"传递 int 的地址吗,...)?

c - 在 C 中获取当前时间/日期/日期的最有效方法

c++ - 如何在 C/C++ 中以编程方式创建软链接(soft link)?

c - 用gcc内联C代码中的所有函数

c++ - 升级 boost 版

c++ - 混合符号整数数学取决于变量大小

C++ - 为什么不能使用 'const' 限定符创建静态成员函数