【问题标题】:Why does Turbo C++ 3.0 give "size of the type is unknown or zero" error for C programs?为什么 Turbo C++ 3.0 会为 C 程序提供“类型大小未知或为零”错误?
【发布时间】:2015-02-02 17:01:18
【问题描述】:
#include<stdio.h>
struct Node
{

};
int main()
{
   return 0;
}

这个简单的代码以文件名 NODE.C 保存,这会产生错误:

ERROR NODE.C 5:类型的大小未知或为零

如果我将扩展名从 NODE.C 更改为 NODE.CPP
,代码可以正常工作 有人可以解释为什么会这样吗?

【问题讨论】:

  • 用 Clang 编译它(一个不会过时的非可怕/可怕/糟糕的编译器)实际上提供了有用的信息:警告:空结构是 GNU 扩展 [-Wgnu-empty -struct]
  • 你的结构中至少需要一个成员。
  • Here are some pictures of Turbo C++ 3.0 at work。我特别喜欢this one,它的“1990, 1992”版权声明。对于那些在家记分的人来说,这个软件已经 24 岁了,并且比实际的 C++ 语言(正如我们今天所知,即标准化)早了 8 年。
  • @remyabel:为什么增加一个成员比如 Node *next; 仍然不能解决问题?它给出了一个声明缺失错误。出了什么问题?
  • @Sidsec9:在 C 中,Node* 没有命名类型。你需要struct Node* next;

标签: c turbo-c++


【解决方案1】:

Empty struct 是 C 中的语法错误。C 语言的语法是这样写的,它禁止空结构。

但是在 C++ 中使用空结构是合法的。这就是为什么 .C 扩展名给你一个错误

【讨论】:

  • 您能否为您的主张提供任何证据
  • 是的,它是用 C99 标准 (ISO/IEC 9899:TC3) 编写的,用于编程语言 C。您可以参考这个以确保安全。open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf(第 101 和 102 - 6.7.2.1 页):- )
  • sigh 是的,知道!我想要得到的是,这应该是你的答案的一部分,通常应该包含证据而不是简单的断言。谢谢!
  • 哦! okeyyy :-( ...下次会记住这一点 :-)
【解决方案2】:

空结构在 C 中是不合法的。

从 C99 标准来看,相关的语法产生是:

请注意,struct-declaration-list 不是可选的,并且必须始终至少有一个 struct-declaration

相比之下,这里是C++语法:

请注意,成员规范是可选的。

另请注意,C++ 中的空 struct 大小不会为零。 C 语言还要求所有对象都具有非零大小;您看到的错误消息并不完全准确(错误是正确的,但描述性消息不正确)。

【讨论】:

  • 对于 C++ 案例,引用语法并不足以证明(语义规则呢?),但我猜会这样做。
  • 我不知道你在说什么;)(编辑是在你回复之前一段时间,几乎是在最初发布之后,但我猜你错过了。)
  • @LightnessRacesinOrbit:我没有提供它来证明 C++ 中允许使用空结构。我指出语法的巨大差异。
  • 您引用的是 C99 标准。您是否知道这与 Turbo C 的起源相距甚远?
  • @fjf2002:如果您可以访问旧标准及其不同,我将很高兴更新答案。同时,我正在使用我现有的措辞。
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多