void在C/C++中的两种不同含义

      在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是一种比较简单的解决方案。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值