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