`
carge
  • 浏览: 51875 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

【转载】在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern "C"声明

 
阅读更多

【来源】:http://blog.myspace.cn/e/400991786.htm

 

     主要是为了解决C++中函数可以重载这个特性,详细原因如下:函数经过编译系统的翻译成汇编,函数名对应着汇编标号。因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main但是C++中函数名与得到的汇编代号有比较大的差别。如:由于函数重载,函数名一样,但汇编代号绝对不能一样。为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,这样就解决了重载问题。具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了。这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun,而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern "C"表示该函数的调用规则是C的规则,则调用时就不使用C++规则的带有参数信息的名字,而是_fun,从而达到调用C函数的目的。

 

分享到:
评论

相关推荐

    在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.pdf

    在 C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”? extern "C" 是连接申明(linkage declaration),它告诉编译器,以 C 语言的方式编译和连接变量和函数。这种方式使得 C++ 程序可以调用被 C ...

    在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.docx

    在C++程序中,调用C编译器编译后的函数需要加extern "C",这是因为C++编译器和C编译器对函数的命名方式不同。C++编译器会对函数名进行名称 mangling,以便支持函数重载和运算符重载,而C编译器则不会。 名称 ...

    extern “C”(让C++程序调用C函数的声明方法)

    ### extern "C":让C++程序调用C函数的声明方法 在现代软件开发过程中,混合编程(即使用多种编程语言共同完成一个项目)变得越来越常见。其中,C++和C是两种经常需要互相调用的语言。由于C++支持函数重载、类型...

    qt调用c语言代码(c语言的代码写在c文件中)

    3. **编译C代码为动态库或静态库**:在完成C语言代码编写后,使用C编译器(如GCC)将其编译为动态库(.so on Linux, .dll on Windows)或静态库(.a on Linux, .lib on Windows)。确保在编译时开启C语言兼容标志,...

    c调用C++函数

    在C++的头文件中,为要被C调用的函数添加`extern "C"`声明: ```cpp extern "C" { void cppFunction(void); } ``` 2. **纯C接口**:C++函数需要提供一个不依赖于C++特性的接口,这意味着不能使用C++特有的...

    C语言调用C++类中的方法

    总之,C语言调用C++类的方法涉及到C++的extern "C"声明、函数指针的使用以及正确的编译和链接步骤。理解这些细节对于进行跨语言编程至关重要。通过实践和调试,你可以更熟练地掌握这一技巧,从而在实际项目中灵活...

    C语言代码用在c++环境中

    3. **解决方案**:通过在C++代码中添加`extern "C"`声明,告诉编译器以C链接约定处理函数,从而解决了链接错误。 ```cpp extern "C" { extern void f1(); } int main() { f1(); return 0; } ``` 通过这种方式,...

    c语言与c++互相调用示例

    3. 在C++中声明C函数:在C++源文件中使用`extern "C"`引入C头文件,声明要调用的C函数。 4. 实现C++调用C的逻辑:在C++源文件中调用C函数。 5. 实现C++函数:在C++源文件中定义C++函数,该函数可以被C调用。 6. 在C...

    关于C和C++中函数的调用约定.doc

    - 明确声明函数的调用约定,如使用`extern "C"`来告诉C++编译器使用C风格的调用约定和名称修饰。 - 在头文件中正确地声明和定义函数,确保参数类型和调用约定一致。 - 对于库函数,了解其编译和链接的约定,确保与...

    C++函数声明和定义

    C++编程语言中,函数声明和定义是两个关键的概念,它们在程序的编译和链接过程中扮演着不同的角色。理解这两个概念对于编写大型、模块化的C++程序至关重要。 首先,函数声明(Function Declaration)主要是告诉...

    浅析extern “C”的作用

    当C++程序需要调用C语言库函数时,必须使用extern "C"来告诉编译器,这些函数是按照C的命名约定来编译的,因此在链接时应该按照C语言的函数名来查找。这样,C++编译器会正确地找到C函数的地址,保证链接成功。 例如...

    ARM汇编 C语言 C++ 相互调用

    - 在C++程序中使用extern "C"来声明C库函数,确保编译器按照C语言的规则进行编译和链接,避免了由于C++对函数名进行名称修饰而导致的链接错误。 3. C++库中包含类的调用: - 如果C++库中含有类,可以在二次接口...

    探索C++的秘密之详解extern

    1. 为C语言编写的函数提供C++声明,这样可以在C++代码中调用C函数。 2. 告诉C++编译器,在编译时按照C语言的规则处理,不进行函数名修饰,保持函数名不变。 3. 常用在混合编程时,尤其是在调用C语言编写的库函数时。...

    c语言调用C++类.zip xcode编译器

    1. **C++类的声明**:C++类需要被声明为`extern "C"`,以避免C++的名称修饰(Name Mangling)。这使得C语言可以识别C++的符号。例如: ```cpp extern "C" { class MyClass { public: void myMethod(); }; } ...

    C++调用c文档

    - **C++调用C**:通常情况下无需显式使用`extern "C"`,但在声明C函数时使用它可以确保链接正确。 - **C调用C++**:必须使用`extern "C"`来确保C++函数按照C链接约定进行编译,从而允许C代码正确地调用它们。 - **...

    C++调用C文件函数简单应用附件

    在C语言文件(如`duke.c`)中,定义一个可被C++调用的函数。C函数必须遵循C语言的链接约定,这意味着不能使用C++特有的特性,如类、模板、名字修饰等。例如: ```c #ifdef __cplusplus extern "C" { #endif ...

    C中如何调用C++函数.pdf

    为了在C代码中调用C++函数,我们通常需要采用一些特殊的手段来确保C++编译器编译出的函数能够被C编译器兼容调用。这些特殊手段包括使用extern "C"关键字,以及通过编写包装函数(wrapper functions)等。 首先,...

    C语言中调用汇编程序

    在C语言中调用汇编程序,我们通常会创建一个C函数的声明,该函数的实现则在汇编代码中完成。这样,C代码可以像调用其他C函数一样调用汇编实现的函数。 例如,给定的C代码`mymain.c`定义了一个名为`myadd`的外部函数...

    qt调用c语言代码(c语言的代码写在c++中)

    1. **头文件声明**:在C++中调用C语言的函数,我们需要一个C语言的头文件来声明这些函数。使用`extern "C"`关键字可以告诉C++编译器这些函数遵循C语言的链接规则。例如: ```cpp extern "C" { #include "my_c_...

    C语言中的extern关键字详细讲述

    `extern`是C语言中的一个关键字,主要用于声明一个变量或者函数的定义存在于当前编译单元之外的地方。当我们使用`extern`声明一个变量或函数时,编译器会认为该变量或函数是在其他地方定义的,当前文件只是引用它...

Global site tag (gtag.js) - Google Analytics