空结构定义在 C 中非法但在 C++ 中不合法?

Posted

技术标签:

【中文标题】空结构定义在 C 中非法但在 C++ 中不合法?【英文标题】:empty struct definitions illegal in C but not C++? 【发布时间】:2010-05-17 14:33:35 【问题描述】:
struct t_empty 
;

这似乎可以在 C++ 中正确编译,但不能在 C 中正确编译。(至少使用 TI 28xx DSP 编译器,它会发出错误“预期声明”)这是在 C 标准中的某处提到的,还是我的编译器坏了?

【问题讨论】:

使用 gcc 4.2 编译良好... 参见 ***.com/questions/1626446/… 了解有关 C 的讨论 来自该链接的 cmets 之一:“空结构是 GCC 扩展。”。谢谢:) @Artefacto:你为什么删除你的帖子? :-( 这很有用。 @Jason S:这是错误的。 ***.com/questions/1626446/… 中接受的答案是正确的。 【参考方案1】:

Empty struct 是 C 中的一个语法错误。C 语言的语法是这样写的,它禁止空结构。 IE。您不会发现它在标准中明确说明,它只是从语法中得出的。

在 C++ 中,空类确实是合法的。

附:请注意,您通常可能会看到 C 标准中的引述 “如果 struct-declaration-list 不包含命名成员,则行为未定义。”,它作为禁止空结构的文档。实际上,空结构再次被文法禁止。因此,字面上的空结构(如您的问题)是语法错误,而不是未定义的行为。标准中的上述引用适用于不同的情况:没有命名成员的结构。如果所有成员都是未命名的位域,则结构可以最终非空,但同时没有命名成员

struct S 
  int : 5;
;

在上述情况下,行为未定义。这就是上面引用的内容。

【讨论】:

以上是关于空结构定义在 C 中非法但在 C++ 中不合法?的主要内容,如果未能解决你的问题,请参考以下文章

windows.h 的 C++ 问题,在 vs17 中非法声明匿名“结构”

我在执行非查询 mysql.dll 期间遇到致命错误,并且空文件路径不合法

C++中“for”循环的范围规则与C中不同? [复制]

systemctl启动pg卡住id52资源管理器不合法

C#System.ArgumentException:“空路径名称不合法。”

空路径名不合法 (vb.net 2005 ,access 2000,)