在 C++ 代码中使用 K&R 风格的 C 函数
Posted
技术标签:
【中文标题】在 C++ 代码中使用 K&R 风格的 C 函数【英文标题】:Using K&R-style C functions in C++ code 【发布时间】:2013-04-10 08:48:56 【问题描述】:我正在尝试在 VS2010 的 VC++ 项目中使用 oncrpc-windows 项目。 oncrpc 导出svc.h 文件中的函数,不带任何参数,但实际上函数有参数。比如头文件导出
#define DllExport __declspec( dllexport )
...
DllExport SVCXPRT *svcudp_create();
但the implementation file 包含
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"
中,标题也会改变其含义。
【参考方案1】:
在编译 .cc 或 .cpp 文件之前,您需要将任何使用 K&R 样式语法的 .c 文件编译为对象文件。这应该在 MakeFile 中完成。
例子:
PNAME = "ProjectName"
PROGRAM_FILES = program.cpp program.h
svc.o: svc.c svc.h
gcc -c $< -o $@
program.o: $(PROGRAM_FILES)
gcc -c $< -o $@
all: svc.o program.o
gcc $< -o $(PNAME)
clean:
-rm -f *.o $(PNAME)
【讨论】:
以上是关于在 C++ 代码中使用 K&R 风格的 C 函数的主要内容,如果未能解决你的问题,请参考以下文章