使用typedef声明void参数列表是非标准的

tec*_*Mav 4 c

我有一个代码片段(遗留代码),代码类似于以下代码:

typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
    .....
}
Run Code Online (Sandbox Code Playgroud)

GCC对这段代码抛出以下警告:警告:#494-D:使用typedef声明void参数列表是非标准的

为什么海湾合作委员会抱怨,为什么这是非标准的?

eca*_*mur 5

这在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 ++可能会暂时拒绝代码.