【发布时间】:2013-04-10 08:48:56
【问题描述】:
我正在尝试在 VS2010 的 VC++ 项目中使用 oncrpc-windows 项目。 oncrpc 导出svc.h 文件中的函数,不带任何参数,但实际上函数有参数。比如头文件导出
#define DllExport __declspec( dllexport )
...
DllExport SVCXPRT *svcudp_create();
SVCXPRT * svcudp_create(sock)
int sock;
{
return(svcudp_bufcreate(sock, UDPMSGSIZE, UDPMSGSIZE));
}
如果我尝试创建使用导出函数的 C 文件,那么一切正常,代码编译成功。问题是我不能在我的 CPP 代码中使用导出的函数,编译器停止并显示以下消息
错误 C2660:“svcudp_create”:函数不接受 1 个参数
我尝试使用extern "C",但没有帮助。我想知道如何在我的 VC++ 项目中使用导出的函数?真的需要自己写签名正确的头文件吗?
【问题讨论】:
-
DllExport SVCXPRT *svcudp_create();标头清楚地表明它不需要 1 个参数。修复标题以匹配他的函数声明。DllExport SVCXPRT *svcudp_create(int ); -
@stardust_ 它是一个 C 头文件,因此声明没有说明函数采用的参数。当然,标题应该包含一个原型,而不仅仅是一个声明。
-
@DanielFischer:如果你用 C++ 编译器编译它,它就是一个 C++ 头文件。
int foo()表示int foo(void),即使foo是extern "C"。 -
如果我错了,请纠正我,但我认为@DanielFischer 是说在 C 中你可以 declare 一个函数而不指定它的参数。您稍后在函数的 定义 中指定参数,并且可以在函数内部使用它们。基本上,问题在于 C++ 编译器将
int foo();视为foo returns int and takes no arguments,而 C 将其视为foo returns int and takes some non-va_arg parameters。 -
@PetrBudnik 是的,虽然 n.m. 的观点非常有效,但如果将其包含在 C++ 文件中,即使包含在
extern "C"中,标题也会改变其含义。
标签: c++ c visual-studio-2010 visual-c++