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

时间:2012-11-19 12:45:08

标签: c

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

typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
    .....
}

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

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

1 个答案:

答案 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 ++可能会暂时拒绝代码。