c11 - C11 是否说明了空翻译单元?如果是,在哪个部分?

标签 c11

我只能在6.9节找到翻译单元的语法,如下:

translation-unit: external-declaration
                  translation-unit external-declaration

从这个语法来看,似乎至少应该有一个外部声明,这意味着不允许有一个空的翻译单元。但是,我想知道编译器在这种情况下需要做什么。如果有 C11 中的描述,任何人都可以指出我吗?

最佳答案

鉴于 翻译单元 的定义,尝试将空源文件视为翻译单元会导致语法错误。

C11 标准的第 5.1.1.3 节(参见 N1570 draft)要求对违反语法规则或约束的翻译单元进行诊断。如果诊断是一个非致命警告并且实现仍然对其进行翻译,则结果行为未定义为遗漏 (4p2)。如果一个实现未能发出诊断消息,则该实现是不符合标准的(至少在您调用它的模式下),并且标准对此无话可说。

虽然特定实现的行为不会直接回答有关语言标准所说内容的问题,但以下是 gcc 和 clang 对空源文件所做的操作(带有告诉它们尝试符合 C11 的选项):

$ gcc -c -std=c11 -pedantic-errors empty.c
empty.c:1:0: error: ISO C forbids an empty translation unit [-Wpedantic]
$ clang  -c -std=c11 -pedantic-errors empty.c
empty.c:1:1: error: ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit]
^
1 error generated.
$

关于c11 - C11 是否说明了空翻译单元?如果是,在哪个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38440469/

相关文章:

c - 是否有任何 C 实现具有无用的单位 `int` 位域?

C11 标准保证将一种数组类型转换为另一种数组类型

c - 错误 C4996 : 'scanf' : This function or variable may be unsafe in c programming

c - 初学者的 scanf_s() 残疾

c - 在代码块中出现 "implicit declaration of function"错误

c - C 中的 Visual Studio 错误,0xfefefefe 处未处理的异常

C11网络编程

ios - 多种c语言方言

c - 如何在 C 中将 typedef 用于 extern 函数?

c - c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗?