gpt4 book ai didi

c++ - 如何在 C++ 程序中使用 C 头文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:53 24 4
gpt4 key购买 nike

我正在 Visual Studio 2010 中开发一个项目,该项目将生成一个 win 32 dll 文件。我的示例是 C 文件,编译和运行良好。我想合并我编写的 C++ 函数中的一些功能,但我遇到了一些困难。

如果我尝试将 C++ 函数链接到 C 程序,它对字符串等一无所知并且根本不起作用(当然)。

因此,我只好将示例更改为 C++ 程序,然后我就可以毫无顾虑地使用我的其他文件了。当我尝试执行此操作时,我收到了一个我不理解的链接错误,并且不确定如何解决。

这些示例使用供应商提供的 header ,其中包括如下语句

 typedef void ( __cdecl *BINDING_PROC_BEVNT)(WORD_T choice, INT_T * pStatus, 
I_EVNT_T * pIn, O_EVNT_T * pOut);

在主体代码中,示例如下:

extern BINDING_PROC_BEVNT       b_evnt;

然后允许你写

b_evnt(choice, &status, &inpEvent, &outpEvent);

在供应商提供的 C 文件中,它们再次被引用为:

BINDING_PROC_BEVNT      b_evnt; 
b_evnt = (BINDING_PROC_BEVNT)GetProcAddress(hCNCMod, "bevnt");

我看到的链接器错误是:

error LNK2001: unresolved external symbol "void (__cdecl* b_evnt)(unsigned short,short *,union I_EVNT_T *,union O_EVNT_T *)" (?b_evnt@@3P6AXGPAFPATI_EVNT_T@@PATO_EVNT_T@@@ZA)

如果我重命名我的主文件并重新编译为 C 程序,并省略我的 C++ 函数,那么一切都可以完美编译。即使主文件作为 C++ 文件处理,Intellisense 似乎也能识别定义(将鼠标悬停在上方会显示正确的定义)。

此外,我尝试将 extern "C"添加到几个不同的位置,但它似乎对 C++ 文件没有影响,并且在 C 文件中产生了编译错误(关于不知道字符串)。

如有任何见解,我们将不胜感激,我今天可能只是盯着它看得太久了,以至于没有注意到一些明显的东西,或者它可能是我完全没有意识到的东西。

感谢您的帮助!

最佳答案

如果针对具有 C 语言绑定(bind)的库进行编译,则必须明确告诉 C++,库的头文件引用 C 对象,而不是 C++ 对象,否则 C++ 名称重整将阻止正确链接。通常你可以这样做:

extern "C" {
#include "vendor.h"
}

这将告诉 C++ 编译器大括号之间的符号是 C 符号,不应应用名称重整。

关于c++ - 如何在 C++ 程序中使用 C 头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com