一个奇怪的问题:在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。