不能在 C 中的中流声明上有标签?

Can't have label on mid-stream declaration in C?

所以在 C99 中是这样的:

label:
  int ret = function(of, stuff);

给出编译时错误,而这:

label:
  ;
  int ret = function(of, stuff);

工作正常。

这是编译器错误吗?或者这是 C 标准定义中的错误?或者,如果这是 C99 标准的一部分,也许有人会站出来为 C 标准辩护,声称这是完全合理的?

Labels,定义在N1256 6.8.1 Labeled statements,只能包含statements.

 Syntax  
1      labeled-statement:  
           identifier : statement  
           case constant-expression : statement  
           default : statement

int ret = function(of, stuff); 是一个 声明 ,它在 N1256 6.7 声明中定义,不是声明。

语句在 N1256 6.8 语句和块中定义如下:

 Syntax
1      statement:
           labeled-statement
           compound-statement
           expression-statement
           selection-statement
           iteration-statement
           jump-statement

compound-statement就是所谓的,也就是0个或多个被{}.

包围的声明和语句

expression-statement 是 N1256 6.5 表达式中定义的零个或一个表达式,后跟分号,如 i++;。语法中的表达式在N1256 6.5.17 Comma operator.

中定义

selection-statementifswitch 语句。

iteration-statementwhiledo-whilefor 语句。

jump-statementgotocontinuebreakreturn 语句。

如您所见,声明不是语句,因此不能给声明加上标签。

可以说是规范中的一个错误——当它被更改为允许语句和声明混合在一个块中(而不是要求所有声明都在语句之前)时,它也应该被更改为允许声明上的标签,但事实并非如此。语言如何随时间演变的产物。

这不是您发现的主要问题,因为您可以通过将标签放在声明之前的空语句上来轻松解决它。