不能在 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-statement
是 if
和 switch
语句。
iteration-statement
是 while
、do-while
和 for
语句。
jump-statement
是 goto
、continue
、break
和 return
语句。
如您所见,声明不是语句,因此不能给声明加上标签。
可以说是规范中的一个错误——当它被更改为允许语句和声明混合在一个块中(而不是要求所有声明都在语句之前)时,它也应该被更改为允许声明上的标签,但事实并非如此。语言如何随时间演变的产物。
这不是您发现的主要问题,因为您可以通过将标签放在声明之前的空语句上来轻松解决它。
所以在 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-statement
是 if
和 switch
语句。
iteration-statement
是 while
、do-while
和 for
语句。
jump-statement
是 goto
、continue
、break
和 return
语句。
如您所见,声明不是语句,因此不能给声明加上标签。
可以说是规范中的一个错误——当它被更改为允许语句和声明混合在一个块中(而不是要求所有声明都在语句之前)时,它也应该被更改为允许声明上的标签,但事实并非如此。语言如何随时间演变的产物。
这不是您发现的主要问题,因为您可以通过将标签放在声明之前的空语句上来轻松解决它。