在 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),即使 fooextern "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 函数的主要内容,如果未能解决你的问题,请参考以下文章

代码风格:关于左花括号位置的研究

K&R风格函数定义问题

C语言代码书写风格

C++ & OpenCV 断言失败

在 K&R 中找到的 C 问题中的二叉树实现

C程序设计语言 (K&R)