expected a “)“ 报错问题! 其原因之一是...(有解)

一个奇怪的问题:在IAR中发现, 未在 Viusal Code 中验证!

函数未打包成 库文件前。以下程序能正常使用(可能是C++编译主文件)。

//源文件
void IF_NewHandle( void*& handle)
{
    if(handle == NULL)
    {
        CTray* tmp = new CTray();
        handle = tmp;
    }
}
//头文件
void IF_NewHandle(CTrayPtr & handle);

//主文件
//使用

#ifdef __cplusplus
extern "C" {
#endif


void* TrayA = NULL;
IF_NewHandle( TrayA ) ; 


#ifdef __cplusplus
}
#endif

打包成DLL后。

CTray is  C++ class.

typedef  void*   CTrayPtr;

头文件 中

void IF_NewHandle(CTrayPtr & handle); 这一行会报警:

Error[Pe018]: expected a ")"  ..........

然后,尝试中发现。

//特别注意:打包的时候不能改,只能调用的时候改。

需要把头文件改成 void IF_NewHandle(CTrayPtr  handle);

然后把主文件中的 调用方式改为 IF_NewHandle(&TrayA)

程序才能正常运行!

【百思不得其解啊!】

好心的网友指导下,为什么会这样呢?

------------------自问自答:

1,主文件编译需要用 C++ 编译就不会报警。上面的问题应该是把程序中的函数替换成DLL时,重新写主文件时,忘记改为C++编译。所以会出现2中的问题。 补充一点,因为C++支持 void* & ,其中& 是引用的意思 ,而C不支持,所以用C++调用不会有问题,而C调用就说头文件有问题。

扩展一下: &* 与 **。

void Newptr(char **p)
{
  static char s[] = "Hello,world!";
  *p = s;
}

void Newptr2(char*& p)
{
  static char s2[] = "HELLO,WORLD!";
  p = s2;
}
int main(void)
{
  char* m1 = NULL;
  char* m2 = NULL;

  Newptr(&m1);
  printf("%s\t\n", m1);

  Newptr(&m2);
  printf("%s\t\n", m2);
}

2,那为什么主文件用C也能编译呢?因为主文件是用C的方式写(无C++关键字)的,但是,不知道为什么C的函数声明中不能用 “&” 这个符号? 声明位置不写 “&” ,在调用的时候写 & ,程序也能通过,看起来运行也正常。

其中2的方式很反常识。所以正常的方法应该是1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值