extern和extern C

news/2025/1/13 7:41:29/

原文传送门:https://blog.csdn.net/lv_Amelia/article/details/79483481

 

extern和extern "C"

2018年03月08日 13:55:00 lv_Amelia 阅读数:128

extern的问题在于你不知道这个关键字出现的时候到底是声明还是定义。 
谨记:声明可以多次,但是定义只能有一次。

函数的声明extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的。

下面分变量和函数来说明: 
(1) 变量 
extern int a; //声明一个全局变量 
int a; //定义一个全局变量

extern int a = 0;//定义全局变量并给初值 
int a = 0; //定义全局变量并给初值 
上面的四个只有第一个extern int a才是声明,其他的全是定义。 
当你要引用一个全局变量时,你就要声明extern int a;这个时候extern不能省,否则就成定义了。

(2) 函数 
函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的。

extern “C”: 
  作为C语言的扩展,C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的设计语言,为了支持函数的重载,C++对全局函数的处理方式有着明显的不同。 
  首先看一下C++对类似C的函数是怎样编译的: 
  作为面向对象的语言,C++为了支持函数重载,函数在被C++编译后在符号库中的名字与C语言的不同。假如某个函数的原型为void foo(int x, int y);该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生_foo_int_int之类的名字。_foo_int_int这样的名字是包含了函数名以及形参,C++就是靠这种机制来实现函数重载的。 
  被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。

extern “C”的惯用法: 
(1) 在C++中引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),需进行以下处理: 
  extern "C" 
  { 
    #include "cExample.h"; 
  }

  而在C语言的头文件中,对其外部函数只能指定为extern,C语言中不支持extern “C”,会报编译错误。

  笔者编写的C++引用C函数的例子工程,包含的三个文件如下 
  /* c语言头文件:cExample.h */ 
  #ifndef C_EXAMPLE_H 
  #define C_EXAMPLE_H 
  extern int add(int x, int y); 
  #endif

  /* c语言的实现文件:cExample.c */ 
  #include "cExample.h" 
  int add(int x, int y) 
  { 
    return x + y; 
  }

  /* c++实现文件,调用add:cppFile.cpp */ 
  extern "C" 
  { 
    #include "cExample.h"; 
  } 
  int main() 
  
    
add(2, 3); 
    return 0; 
  } ` 
  如果C++调用一个C语言编写的.DLL时,在包含.DLL的头文件或声明接口函数时,应该也要加上extern “C”。

(2) C中引用C++语言中的函数或者变量时,C++的头文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”的该头文件,应该仅在C中将C++中定义的extern “C”函数声明为extern类型。

  笔者编写的C引用C++函数的例子工程,源文件代码如下: 
  /* c++头文件cppExample.h */ 
  #ifndef CPP_EXAMPLE_H 
  #define CPP_EXAMPLE_H 
  extern "C" int add(int x, int y); 
  #endif

  /* c实现文件cFile.c */ 
  extern int add(int x, int y); 
  int main() 
  { 
    add(2, 3); 
    return 0; 
  }


http://www.ppmy.cn/news/167779.html

相关文章

extern 和 extern “C“

extern extern 是用来进行外部声明的。 谨记:声明可以多次,但是定义只能有一次。 函数的声明extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的。 当我们需要使用在其它文件中定义的全局变量或全局函数时,需要先用…

c 语言 extern

#include <stdio.h> // 函数外定义变量 x 和 y int x; (int x 为全局变量&#xff0c;是声明&#xff0c;声明可以有多次&#xff0c;不会报错&#xff09; int x; int y; int addtwonum() { // 函数内声明变量 x 和 y 为外部变量 //extern int x; // extern int…

Intel Xeon E5-2620 v4(至强E5-2620 v4)

(恩威科技在线成都行情)Intel 至强E5-2620 v4是一颗服务器的处理器&#xff0c;拥有超强的性能&#xff0c;性价比非常高&#xff0c;运算能力超过i7-2600&#xff0c;采用14纳米制作工艺&#xff0c;而且八核心十六线程数&#xff0c;也让该机大放异彩。目前正在商家处有现货出…

ThinkPad X220i的一些使用感受

先说感官优点&#xff1a; 轻。 再说感官缺点&#xff1a; 1、键程有点长&#xff0c;键盘手感硬了一些&#xff08;对比T61、T42&#xff09;这样在打字的时候就要使用更多的力气&#xff0c;使用以前在其他机器上的同样的力气按下去不一定能够打出来字。 2、右侧USB口和网…

CMake String函数:如何巧妙地在cmake中操作字符串

CMake String&#xff1a;从基础操作到高级应用的全面探索 1. CMake String的基本操作&#xff08;Basic Operations of CMake String&#xff09;1.1 字符串创建与赋值&#xff08;Creating and Assigning Strings&#xff09;1.2 字符串连接&#xff08;String Concatenation…

ThinkPad X230i安装ACHI

ACHI全称是Serial ATA Advanced Host Controller Interface(achi是串行ATA高级主控接口/高级主机控制器接口&#xff09;&#xff0c;比IDE模式可以提供更快的硬盘读取速度。安装方法&#xff1a; 下载驱动&#xff1a; Thinkpad ACHI驱动下载 一、升级安装&#xff1a; 1.开机…

ThinkPad X220i 安装 Mac OSX

联想笔记本是安装黑苹果相对比较容易的~~ ThinkPad X220i配置 型号&#xff1a;ThinkPad X220i CPU&#xff1a; i3 内存&#xff1a;4G 显卡&#xff1a;HD3000 其他: X220i的通用硬件 确认以上硬件驱动无误后&#xff0c;即可下载下面的驱动包&#xff0c;驱动包中包含了驱…

thinkpad X220i 内存升级

前几天刚进手的thinkpad X220i 4286A48 320G 2G内存 然后装了WIN7 32 位 旗舰版,刚开始用起来很爽, 可是慢慢感觉系统变慢, 发现 2G的内存用了1.3个G 内存 还有是集成显卡的,显卡是共享内存的,整个系统用起来不顺手。后来在淘宝花了130多淘了一根4G的DDR3 1333 金士顿…