我有一个代码片段(旧代码),其代码类似于以下内容:
typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
.....
}
GCC 会针对这段代码抛出以下警告:警告:#494-D:使用 typedef 声明 void 参数列表是非标准的
为什么 GCC 抱怨,为什么这是非标准的?
我有一个代码片段(旧代码),其代码类似于以下内容:
typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
.....
}
GCC 会针对这段代码抛出以下警告:警告:#494-D:使用 typedef 声明 void 参数列表是非标准的
为什么 GCC 抱怨,为什么这是非标准的?
这在 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 中,因此可以假定存在于该标准的下一版本中,并且可能存在于 C++11 的第一个 TC 中。由于显而易见的原因,typedefvoid
不能依赖于模板参数。问题G++ error: '<anonymous>' has incomplete type与 g++ 讨论了这个问题,并表明 g++ 可能会暂时继续拒绝该代码。