我有一段代码,其中有一条声明void();
int main()
{
void( ); // 1: parses fine in GCC 5.4.0 -Wpedantic
// void; // 2: error declaration does not declare anything
}
1 void()
究竟是什么?
1 void()
与2 void;
的区别是什么?
我已经读过了:
但我很好奇松散语句void();不同于其中之一(当然为什么)
答案 0 :(得分:4)
void;
是一个错误,因为语言语法中没有与该代码匹配的规则。特别是,没有规则 type-id
;
,
但是,代码void()
匹配两个语法规则:
type-id
。postfix-expression
,子案例为 simple-type-specifier
(
expression-list-opt
)
。 现在,解析器需要将void();
与语法规则匹配。即使void()
与 type-id
匹配,如前所述,也没有符合 type-id
;
的规则。因此,解析器拒绝在此上下文中将void()
解析为 type-id
,并尝试另一种可能性。
是一系列规则,用于定义 postfix-expression
;
生成语句。因此,void()
在此上下文中被明确地解析为 postfix-expression 。
正如您已经链接的其他答案所述,此代码作为后缀表达式的语义含义是void
类型的prvalue。
答案 1 :(得分:0)
void
表达式。
编译器不会为它创建任何代码,例如,
VS中的
_asm
{
nop;
}
void();
_asm
{
nop;
}
生成这个程序集:
_asm
{
nop;
003017CE nop
}
void();
_asm
{
nop;
003017CF nop
}