我有一个代码段(遗留代码),代码类似于以下代码:
typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
.....
}
GCC对这段代码抛出以下警告: 警告:#494-D:使用typedef声明void参数列表是非标准的
为什么海湾合作委员会抱怨,为什么这是非标准的?
答案 0 :(得分:5)
这在C89和C99之间发生了变化。
C89有(6.5.4.3):
参数类型列表指定类型,并可以声明 标识符,函数的参数。 [...]
void
的特殊情况作为列表中唯一的项目指定了 功能没有参数。
在C99中,这改为(6.7.5.3p10; C11中6.7.6.3p10):
类型
void
的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数。
这有时意味着在C89中,在声明0参数函数时,只有文字标记void
(在预处理之后)是可接受的,而在C99中,允许使用typedef。但是,根据defect report 157标准,这不是标准的目的:
子条款6.7.1明确指出,它是一个单一参数,其类型为
void
(与使用void
关键字相对),表示函数不带参数。 为清楚起见,应重新说明子条款6.5.4.3,以强调它是void
类型,而不是重要的关键字void
。
对于C ++,defect 577使C ++符合C99;该解析在C ++ 11中不存在,但存在于标准草案n3376中,因此可以假设它出现在标准的下一个版本中,并且可能出现在第一个TC到C ++ 11中。由于显而易见的原因,void
的typedef不能依赖于模板参数。问题G++ error: ‘<anonymous>’ has incomplete type用g ++讨论了这个问题,并指出g ++可能会暂时拒绝代码。