• extern关键字


    extern关键字有两个作用

    一、告知编译器:当extern与“c”一起使用的时候,就是告诉编译器,下面的函数或者变量以C语言的方式编译。这里主要是因为一方面我们可以使用C语言写成的项目运用到C++中,另一方面由于C++支持重载而C不支持,这就导致了C++在编译的时候,C++的函数名会和参数一起被编成函数名,而C只是函数名。所以在链接的时候,找不到我们定义的那个函数。

    1 //模块A头文件 moduleA.h
    2 #idndef _MODULE_A_H  //对于模块A来说,这个宏是为了防止头文件的重复引用
    3 #define _MODULE_A_H
    4  
    5 int foo(int x, int y);
    6 #endif 
    //模块B实现文件 moduleB.cpp
    #include"moduleA.h"
    foo(2,3); 

    上面的两个模块如果用C++编译以后,那我们的obj文件的模块A的foo函数的函数名可能是_foo_int_int(每个编译器的值不同),但是模块B的函数名是_foo,这样我们去找A的话是找不到,所以就会有错误。

     1 //moduleA头文件
     2 #ifndef __MODULE_A_H //对于模块A来说,这个宏是为了防止头文件的重复引用
     3 #define __MODULE_A_H
     4 int fun(int, int);
     5 #endif
     6  
     7 //moduleA实现文件moduleA.C //模块A的实现部分并没有改变
     8 #include"moduleA"
     9  
    10 int fun(int a, int b)
    11 {
    12     return a+b;
    13 }
    14 
    15 //moduleB头文件
    16 #idndef __MODULE_B_H //很明显这一部分也是为了防止重复引用
    17 #define __MODULE_B_H
    18  
    19 #ifdef __cplusplus //而这一部分就是告诉编译器,如果定义了__cplusplus(即如果是cpp文件, extern "C"{ //因为cpp文件默认定义了该宏),则采用C语言方式进行编译
    20  
    21 #include"moduleA.h"
    22 #endif
    23  
    24//其他代码
    25  
    26 #ifdef __cplusplus
    27 }
    28 #endif
    29 #endif
    30  
    31 //moduleB实现文件 moduleB.cpp //B模块的实现也没有改变,只是头文件的设计变化了
    32 #include"moduleB.h"
    33 int main()
    34 {
    35     cout<<fun(2,3)<<endl;
    36 }

     这里我们看到#ifdef __cplusplus这个宏告诉C++编译器如果遇到extern “C” 则以c语言的方式编译。这样我们fun(int ,int)函数编译以后就是_fun,所以在调用的时候我们根据_fun就可以找到函数的定义了。

    二、就是共享:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

     1 //在test1.h中有下列声明:
     2 #ifndef TEST1H
     3 #define TEST1H
     4 extern char g_str[]; // 声明全局变量g_str
     5 void fun1();
     6 #endif
     7 
     8 // 在test1.cpp中
     9 #include "test1.h"
    10 char g_str[] = "123456"; // 定义全局变量g_str
    11 void fun1() { cout << g_str << endl; }
    12 
    13 //以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了
    14 #include "test1.h"
    15 void fun2()    { cout << g_str << endl;    }

    在test2中我们就可以使用test1的变量。

    参考:https://www.cnblogs.com/carsonzhu/p/5272271.html、https://www.cnblogs.com/yuxingli/p/7821102.html

  • 相关阅读:
    python函数练习题2
    python函数练习题1
    数字是否是10的整数倍
    关于循环的作业:登陆程序
    用for循环写这段代码
    while循环语句
    在CentOS8 上安装Python3
    时隔半年再写购物车程序并改进
    vue上传
    根据生日计算年龄
  • 原文地址:https://www.cnblogs.com/xiaodangxiansheng/p/10946978.html
Copyright © 2020-2023  润新知