空结构定义在 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 期间遇到致命错误,并且空文件路径不合法