相关疑难解决方法(0)

结合C++和C - #ifdef __cplusplus如何工作?

我正在开发一个包含大量遗留C代码的项目.我们已经开始用C++编写,目的是最终转换遗留代码.我对C和C++的交互方式有点困惑.我知道通过使用C++编译器包装C代码extern "C"不会破坏C代码的名称,但我不完全确定如何实现它.

因此,在每个C头文件的顶部(在包含警卫之后),我们有

#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

在底部,我们写

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

在两者之间,我们拥有所有的includes,typedef和函数原型.我有几个问题,看看我是否理解正确:

  1. 如果我有一个C++文件A.hh,其中包含一个C头文件Bh,包含另一个C头文件Ch,这是如何工作的?我认为当编译器进入Bh时, __cplusplus将被定义,因此它将包装代码extern "C" (并且__cplusplus不会在此块内定义).因此,当它进入Ch时, __cplusplus将不会定义并且代码将不会被包装 extern "C".它是否正确?

  2. 包装一段代码有什么问题 extern "C" { extern "C" { .. } }吗?第二个会extern "C" 做什么?

  3. 我们不把这个包装器放在.c文件周围,只放在.h文件中.那么,如果函数没有原型会发生什么?编译器是否认为它是C++函数?

  4. 我们还使用了一些用C语言编写的第三方代码,并没有这种包装.每当我从该库中包含一个标题时,我就一直extern "C"在使用#include.这是处理这个问题的正确方法吗?

  5. 最后,这是一个好主意吗?还有什么我们应该做的吗?我们将在可预见的未来混合C和C++,我想确保我们覆盖所有基础.

c c++ c-preprocessor extern-c

293
推荐指数
4
解决办法
20万
查看次数

如何调用C++函数C++/CLI

我已经查看过很多在线搜索,大多数都有C#与C或C++一起讨论C#的例子,但从未遇到过使用C++调用C DLL(特别是在我的情况下使用带有WPF的C++/CLI).

有人可以用一个例子来解释如何在C++中调用C DLL函数.我有一个C DLL,其所有函数都定义为extern"C"funcName(),还有一个导出函数.def文件,其中包含所有需要导出的函数名.现在有了这个C DLL,我如何在C++代码中调用它的导出函数.

谢谢.

c c++ dll c++-cli

2
推荐指数
1
解决办法
3639
查看次数

错误:extern"C"上的预期unqualified-id

我有一个cpp代码,我想在其中调用ac函数.两者都编译好.o文件,但是当clang ++正在执行编译时,我收到以下错误:

file.cpp:74:12: error: expected unqualified-id
    extern "C"
           ^
Run Code Online (Sandbox Code Playgroud)

cpp文件中的代码如下:

void parseExtern(QString str)
{
#ifdef __cplusplus
    extern "C"
    {
#endif
        function_in_C(str);
#ifdef __cplusplus
    }
#endif

}
Run Code Online (Sandbox Code Playgroud)

如何避免错误?我无法使用clang ++编译c文件,我真的需要使用extern.谢谢.

c++ clang extern-c

1
推荐指数
1
解决办法
5723
查看次数

标签 统计

c++ ×3

c ×2

extern-c ×2

c++-cli ×1

c-preprocessor ×1

clang ×1

dll ×1