标签: extern-c

1511
推荐指数
11
解决办法
72万
查看次数

结合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++中使用extern"C"{#include <foo.h>}?

为什么我们需要使用:

extern "C" {
#include <foo.h>
}
Run Code Online (Sandbox Code Playgroud)

特别:

  • 我们什么时候应该使用它?

  • 在编译器/链接器级别发生了什么,需要我们使用它?

  • 如何在编译/链接方面解决了需要我们使用它的问题?

c++ name-mangling linkage extern-c

133
推荐指数
10
解决办法
8万
查看次数

为什么C函数不能被命名?

我最近接受了一次采访,问了一个问题是extern "C"C++代码的用法是什么.我回答说它是在C++代码中使用C函数,因为C不使用名称修改.我被问到为什么C不使用名称错误,说实话我无法回答.

我知道当C++编译器编译函数时,它为函数提供了一个特殊的名称,主要是因为我们可以在C++中使用同名的重载函数,这些函数必须在编译时解析.在C中,函数的名称将保持不变,或者在它之前使用_.

我的疑问是:允许C++编译器破坏C函数有什么问题?我原以为编译器给它们的名称无关紧要.我们在C和C++中以相同的方式调用函数.

c c++ name-mangling extern-c

133
推荐指数
8
解决办法
1万
查看次数

从C++代码调用C函数

我有一个C函数,我想从C++调用.我无法使用" extern "C" void foo()"方法,因为C函数无法使用g ++编译.但它使用gcc编译很好.有关如何从C++调用函数的任何想法?

c c++ linux extern-c

81
推荐指数
3
解决办法
8万
查看次数

如何从C调用C++函数?

我知道这个.

从C++调用C函数:

如果我的应用程序是在C++中,我不得不从用C编写的库调用函数.那么我会使用

//main.cpp

extern "C" void C_library_function(int x, int y);//prototype
C_library_function(2,4);// directly using it.
Run Code Online (Sandbox Code Playgroud)

这不会破坏名称C_library_function,链接器会在其输入*.lib文件中找到相同的名称,问题就解决了.

从C ???调用C++函数

但是在这里我扩展了一个用C语言编写的大型应用程序,我需要使用一个用C++编写的库.C++的名称错误导致了麻烦.Linker抱怨未解决的符号.好吧,我不能在我的C项目中使用C++编译器,因为这会破坏很多其他东西.出路是什么?

顺便说一句,我正在使用MSVC

c c++ visual-c++ extern-c

74
推荐指数
4
解决办法
8万
查看次数

对于名称或类型具有特定语言链接意味着什么?

根据(c)ANSI ISO/IEC 14882:2003,第127页:

链接规范嵌套.当链接规范嵌套时,最里面的规则确定语言.链接规范不会建立范围.链接规范只应在命名空间范围内发生(3.3).在链接规范中,指定的语言链接适用于声明引入的所有函数声明符,函数名和变量名的函数类型.

extern "C" void f1(void(*pf)(int));
// the name f1 and its function type have C language
// linkage; pf is a pointer to a C function

extern "C" typedef void FUNC();
FUNC f2;
// the name f2 has C++ language linkage and the
// function's type has C language linkage

extern "C" FUNC f3;
// the name of function f3 and the function's type
// have C language linkage

void (*pf2)(FUNC*);
// the name of the variable …
Run Code Online (Sandbox Code Playgroud)

c c++ standards linkage extern-c

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

函数声明只需要extern"C"吗?

我写了一个C++函数,我需要从C程序调用.为了使它可以从C调用,我extern "C"在函数声明中指定.然后我编译了C++代码,但编译器(Dignus Systems/C++)为该函数生成了一个错位的名称.所以,它显然没有尊重extern "C".

为了解决这个问题,我添加extern "C"了函数定义.在此之后,编译器生成了一个可从C调用的函数名.

从技术上讲,extern "C"唯一需要在函数声明中指定.这是正确的吗?(C++ FAQ Lite就是一个很好的例子.)你还应该在函数定义中指定吗?

这是一个证明这一点的例子:

/* ---------- */
/* "foo.h"    */
/* ---------- */

#ifdef __cplusplus
extern "C" {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif

/* ---------- */
/* "foo.cpp"  */
/* ---------- */

#include "foo.h"

/* Function definition */
extern "C"               // <---- Is this needed?
void foo(int i) {
  // do …
Run Code Online (Sandbox Code Playgroud)

c c++ extern extern-c

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

外部"C"声明如何工作?

我正在学习编程语言课程,我们正在谈论extern "C"声明.

除了"它接口C和C++"之外,这个声明如何在更深层次上工作?这又如何影响程序中发生的绑定?

c c++ extern-c

27
推荐指数
6
解决办法
5万
查看次数

什么时候用简单的单词使用extern"C"?

也许我不理解C和C++之间的差异,但我们何时以及为什么需要使用

extern "C" {
Run Code Online (Sandbox Code Playgroud)

?显然它是一个"联系会议".

我简单地阅读了它,并注意到MSVS附带的所有.h头文件都包含它们的代码.什么类型的代码到底是"C代码"而不是"C++代码"?我以为C++包含了所有的C代码?

我猜这不是这种情况,C++是不同的,标准特性/功能存在于一个或另一个中,但不是两个(即:printf是C和cout是C++),但是C++是向后兼容的,尽管外部"C"声明.它是否正确?

我的下一个问题取决于第一个问题的答案,但无论如何我会在这里问:由于用C语言编写的MSVS头文件被extern"C"{...}包围,你什么时候需要使用它你自己的代码?如果您的代码是C代码并且您正在尝试在C++编译器中编译它,那么它是否应该没有问题,因为您包含的所有标准h文件在C++编译器中已经有了外部"C"的东西?

在C++中编译但是链接到已经构建的C库或其他东西时,你是否必须使用它?

c c++ extern-c

26
推荐指数
4
解决办法
2万
查看次数