赞
踩
在wrlinux3.0环境下编译项目代码,报出大量的'<anonymous>' has incomplete type,invalid use of 'VOS_VOID'的错误,经分析大致原因如下:
void作为一个C/C++关键字,有两层含义。第一层含义就是大家熟知的,作为一种“不是类型”的类型。它还有另一层含义,就是写在函数的参数表里面,表示这个函数不接受任何参数。后一种含义其实是从C语言中继承而来,因为C语言里面,如果函数的参数表为空的话,表示这个函数可以接受任意参数。比如:
void func()
{
printf("Hello, world!\n");
}
int main()
{
func("Hello, world!"); //用gcc编译通过,运行正确;而用g++编译通不过
return 0;
}
在这种情况下,为了限定这个函数不会接受任何参数,必须在参数表里面写一个void,也就是写成void func(void)。C++的检查比C语言更严格,如果函数的参数表为空,则表示这个函数不会接受任何参数,换句话说,void func()和void func(void),效果都一样。此时,void的第二层含义就逐渐被淡化。
接下来把刚才的代码做一个简单的变化:
typedef void VOS_VOID;
VOS_VOID func(VOS_VOID);
由于使用了typedef,所以void被理解为第一层含义:作为一种“不是类型”的类型。简单点说,VOS_VOID是一种类型。但实际上函数的参数不可能是VOS_VOID类型(因为你不可能把一个VOS_VOID类型的值作为参数传到函数里面),所以编译出错。
在当前项目的代码中,其实存在大量上述这种情况,把typedef void VOS_VOID改成#define VOS_VOID void是一种比较简单的解决方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。