C11是否说过空翻译单元?如果是,请在哪个部分?

问题描述 投票:2回答:1

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

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

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

c11
1个回答
2
投票

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

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.
$
© www.soinside.com 2019 - 2024. All rights reserved.