Questions tagged «extern-c»


4
结合C ++和C-#ifdef __cplusplus如何工作?
我正在一个有很多遗留C代码的项目中。我们也开始使用C ++进行编写,以期最终也转换旧代码。我对C和C ++的交互方式有些困惑。我了解到,用C ++编译器包装C代码extern "C"不会破坏C代码的名称,但是我不确定如何实现这一点。 因此,在每个C头文件的顶部(在包含保护之后),我们有 #ifdef __cplusplus extern "C" { #endif 在底部,我们写 #ifdef __cplusplus } #endif 在这两者之间,我们拥有所有的include,typedef和函数原型。我有几个问题,看我是否正确理解: 如果我有一个C ++文件A.hh,其中包括一个C头文件Bh,包括另一个C头文件Ch,那么该如何工作?我认为,当编译器进入Bh时, __cplusplus将被定义,因此它将包装代码extern "C" (并且__cplusplus不会在此块内定义)。因此,当它进入Ch时, __cplusplus将不会被定义,并且代码也不会被包装在中 extern "C"。它是否正确? 将一段代码包装起来有什么问题 extern "C" { extern "C" { .. } }吗?第二个extern "C" 怎么办? 我们不会在.c文件中放这个包装器,而在.h文件中放。那么,如果一个函数没有原型怎么办?编译器是否认为这是C ++函数? 我们还使用了一些用C编写的第三方代码,并且这些代码没有这种包装。每当我包含该库中的标头时,我都会extern "C"在#include中放一个。这是解决这个问题的正确方法吗? 最后,这是一个好主意吗?还有什么我们应该做的?在可预见的将来,我们将混合使用C和C ++,我想确保我们涵盖了所有基础知识。


9
为什么不能对C函数进行名称修改?
我最近接受了一次采访,一个问题被问到extern "C"C ++代码中的用途是什么。我回答说它是在C ++代码中使用C函数,因为C不使用名称修饰。我被问到为什么C不使用名称修饰,老实说我无法回答。 我知道C ++编译器在编译函数时会给函数起一个特殊的名称,主要是因为我们可以在C ++中使用同名的重载函数,这些重载函数必须在编译时进行解析。在C语言中,函数的名称将保持不变,或者在其前面加上_。 我的查询是:允许C ++编译器也处理C函数怎么了?我本来以为编译器给它们起什么名字都没关系。我们在C和C ++中以相同的方式调用函数。
136 c++  c  name-mangling  extern-c 

4
从C ++代码调用C函数
我有一个想从C ++调用的C函数。我无法使用“ extern "C" void foo()”这样的方法,因为C函数无法使用g ++进行编译。但是使用gcc可以很好地编译。有什么想法如何从C ++调用函数吗?
90 c++  c  linux  extern-c 

7
如何从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. 这不会破坏名称C_library_function,链接器将在其输入* .lib文件中找到相同的名称,从而解决了问题。 从C调用C ++函数??? 但是在这里,我扩展了一个用C编写的大型应用程序,我需要使用一个用C ++编写的库。C ++的名称修改在这里引起麻烦。链接器抱怨未解析的符号。好吧,我不能在我的C项目上使用C ++编译器,因为那打破了很多其他东西。出路是什么? 顺便说一句,我正在使用MSVC
84 c++  c  visual-c++  extern-c 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.