extern "C" 的含义:????实现C++与C及其它语言的混合编程

C++中extern "C"的设立动机是实现C++与C及其它语言的混合编程。

C++为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。对于函数void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

  通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。

例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。

  与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。

  被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

例如:假设在C++中:

// 模块A头文件 moduleA.h

int foo( int x, int y );

在模块B中引用该函数:

// moduleB.cpp

#include "moduleA.h"

foo(2,3);

  实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

加extern "C"声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h

extern "C" int foo( int x, int y );

在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

  (1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;

  (2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

  如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。例如:

//C++头文件 a.h

extern "C" int foo( int x, int y );

//C++实现文件 a.cpp

#include "a.h"

int foo( int x, int y ){return x + y;}

/* C实现文件 b.c

这样会编译出错:#include "a.h" */

extern int foo( int x, int y );

int main( int argc, char* argv[] ){

foo( 2, 3 );

return 0;

}

extern "C" 的含义:????实现C++与C及其它语言的混合编程,布布扣,bubuko.com

时间: 2024-10-01 00:23:19

extern "C" 的含义:????实现C++与C及其它语言的混合编程的相关文章

extern "C" 的含义:????实现C++与C及其他语言的混合编程

C++中extern "C"的设立动机是实现C++与C及其他语言的混合编程. C++为了支持函数的重载.C++对全局函数的处理方式与C有明显的不同. 对于函数void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo.而C++编译器则会产生像_foo_int_int之类的名字. extern是C/C++语言中表明函数和全局变量作用范围(可见性)的keyword.该keyword告诉编译器.其声明的函数和变量能够在本模块或其他模块中使用. 通常.在

内联函数:static inline 和 extern inline 的含义

引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数是一种更高级的抽象.它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现:函数的引入可以减少程序的目标代码,实现程序代码和数据的共享.但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行.因此,函数调用要有一定的

【编程语言】extern "C"让C++与C进行混合编程

最近工作不算轻松,现在作为一个项目的负责人统一管理着前端.后端.设计.产品,身上肩负着不小责任,虽然有压力但是对于自己也是一种锻炼.同时自己也在负责整个后端的架构设计,虽然后端经验不是很多,但是自己正是发挥优点的时候. 回到正题,在Android NDK开发的时候,我们会遇到extern "C"这个关键字,我们写JNI函数的时候都会加上这个.那么这个关键字到底有什么作用呢? C与C++对函数的处理: 其实编译器对于C与C++文件的处理是不一样的,我们使用编译器(GCC)对于C来说,生成

深入理解extern用法

一. extern做变量声明 l  声明extern关键字的全局变量和函数可以使得它们能够跨文件被访问. 我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,然后用一个同名的*.h文件包含所有的函数和变量的声明.如: /*Demo.h*/ #pragma once extern inta; extern intb; intadd(inta,intb); /*Demo.cpp*/ #include "Demo.h" /*这句话写或者不写在本例中都行,不过建议不写*/ /

深入理解extern使用方法

一. extern做变量声明 l  声明externkeyword的全局变量和函数可以使得它们可以跨文件被訪问. 我们一般把全部的全局变量和全局函数的实现都放在一个*.cpp文件中面,然后用一个同名的*.h文件包括全部的函数和变量的声明.如: /*Demo.h*/ #pragma once extern inta; extern intb; intadd(inta,intb); /*Demo.cpp*/ #include "Demo.h" /*这句话写或者不写在本例中都行,只是建议不写

extern "C"解析

转自大牛的解析(非常具体详细)http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 我做个简单的标注方便以后自己查看: 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus //采用c++,自动定义__cplusplus的宏 extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif extern "C"

(转)C++中extern “C”含义深层探索

(转)C++中extern "C"含义深层探索  1.引言 C++语言的创建初衷是"a better C",但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为"不彻底地面向对象"),因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.

extern “C”的使用

2016-12-11   22:40:48 VS编译的时候,可以指定编译为C代码或者C++代码.c/c++->高级.而当你新建一个cpp文件时,VS很有可能自动会把编译方式由C变成C++编译.然而,C和C++编译出来的符号的定义是不一样的(因为C++会有重载),所以可能出现:用C++编译出来的目标文件,在调用C编译出来的目标文件里面的函数时,找不到符号.那么为了实现C++语言调用C语言库,那么应该在C语言库的头文件.h里面,加入extern c的声明,使得就算.h文件被C++文件包含时,仍然能够

(转)extern关键字两种场景的使用

第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:extern int a;仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间.变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误.通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明.例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需