C++之烦躁的extern

1. 声明与定义

一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明

  • 区分是定义还是声明关键在于看计算机是否为变量分配了存储空间
    extern int a;    //声明一个全局变量
    int a;           //定义一个全局变量
    extern int a = 0;  //定义全局变量并给初值
    int a = 0;        //定义全局变量并给初值

(注意:在一个程序中,变量只能被定义一次,但可以多次声明)

2. extern 变量

  • 在其他文件中定义过的全局变量,在另一个文件中要调用时,只需在声明语句前加关键字extern

    //文件1,定义变量
      int i= 1;
    
    //文件2,声明变量
      extern int i;
    
  • 对于常量,要调用其他文件的常量时,做法如下:

    //文件1,定义常量
      extern const int i = 1;
    
    //文件2,声明常量
      extern const int i;
    

3. extern 函数

  • 函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的
  • 故函数的声明extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的

4. extern “C”

首先探讨一个问题:

4.1为什么c语言不支持函数重载

   c语言编译器对函数名字修饰规则是下划线+函数名, 相同函数名的底层名称一样.
   c++编译器修饰规则是一系列的字母: ?函数名@@YAHHH@Z, 其中三个H意思是返回值, 第一个参数类型, 第二个参数类型. 将参数的类型编译到最终函数的名字

例如: H是int, N是double			

   那为什么编译器对函数名的名字中有返回值得类型, 函数重载时却与返回值的类型无关?

1. 因为这种命名可能仅仅是VS的, 其他的编译器可能不是这样编译
2. 当进行函数调用时, 仅仅因为返回值不同无法确定是调用哪个函数
  • 要想在cpp文件定义函数时使用c的命名方法, 函数定义前加 extern “C” int add(int left, int right)

  • extern “C”的真实目的:实现C++与C的混合编程

4.2 (应用1) 在.c文件使用.cpp的函数

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

      C语言中不支持extern “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; 
  }

4.3 (应用2) 在.cpp文件中使用.c的函数

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

  /* 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; 
  }
发布了53 篇原创文章 · 获赞 46 · 访问量 7206

猜你喜欢

转载自blog.csdn.net/new_bee_01/article/details/104367826