• C++:重定义:符号重定义:变量重定义(三):解决变量重定义(声明extern外部变量)


    在上一篇文章中,我们知道:可以通过声明 const/ static 变量来隔离变量在源文件的可见性,来解决变量重复定义的问题,

    C++:重定义:符号重定义:变量重定义(二):解决变量重定义(const static)_hongwen_yul的博客-CSDN博客

    这一篇文章我们介绍:如果都不 include 这个头文件(就是说我源文件都不包含变量 A ),那也解决了重定义的问题了。为此C++ 提出了 “extern” 这个关键字来解决这个问题。

    extern :

    1.       extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义.
    2.      extern还要一个好处就是:我就是想用某个头文件某个变量,但是这个头文件有太多逻辑,我又不想把一些无关代码逻辑 include进来,那么将你想使用的这个变量声明为 extern外部变量,是一个很好的方法。

    1:extern变量理论依据

    •  外部变量(即全局变量)函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。
    • 外部变量实在函数外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。
    • 如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
    • 关于extern关键字,谭浩强老师的<>中有一段精准而到位的表述:

     2:用 extern 声明外部变量,扩展程序文件中的作用域。

    1. #include
    2. int max(int x, int y)
    3. {
    4. int z;
    5. z = x > y ? x : y;
    6. return(z);
    7. }
    8. int main()
    9. {
    10. extern int C, B;
    11. printf("%d\n", max(C, B));
    12. return 0;
    13. }
    14. int C = 13, B = -8;
    15. // 很显然:在mian()函数:printf() 函数:max()函数需要用到 变量 C 和 B
    16. // 但是 这两个变量是在使用之后定义的
    17. // 为了能这样使用,我们将变量 用 extern修饰
    18. // 这样声明了 两个外部变量 extern int C, B ,扩展了变量的作用域(并且作用域从变量声明开始到 源文件结束)
    1. 采用 gcc 命令输出结果
    2. 1: gcc -mian.cpp -o mian.exe : 输出 应用程序 main.exe
    3. 2: ./main.exe : 运行当前程序
    4. 313 : 程序运行结果

    PS :  如果在编译过程中,gcc 指令出现下面错误:

    undefined reference to `std::ios_base::Init::Init() 解决

    (一)gcc 编译C++程序是提示错误undefined reference to `std::ios_base::Init::Init() 的解决方法

    在linux下编译c++ 程序要使用g++ 编译器,如果你要是使用gcc编译器就会有上面的报错信息,只要在在gcc后加上 -lstdc++就ok了

    eg: gcc example.c -lstdc++

    (二)gcc 和 g++ 是有区别的

    (1)gcc和g++都是GNU(组织)的一个编译器。

    (2)后缀名为.c的程序和.cpp的程序g++都会当成是c++的源程序来处理。而gcc不然,gcc会把.c的程序处理成c程序。

    (3)对于.cpp的程序,编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。(个人觉得这条是最重要的)

     3:用 extern 声明外部变量,其他源文件定义变量

    1. 公共头文件
    2. a.h
    3. #pragma once
    4. extern int A;
    5. //很多其他代码。。。。。。
    6. a.cpp
    7. #include"a.h"
    8. int A = 3;
    9. =========================================================================================
    10. b.h
    11. #pragma once
    12. #include
    13. void fb();
    14. b.cpp
    15. #include"b.h"
    16. extern int A;
    17. void fb() {
    18. printf("%d", A+1);
    19. }
    20. ===========================================================================================
    21. c.h
    22. #pragma once
    23. #include
    24. void fc();
    25. c.cpp
    26. #include"c.h"
    27. extern int A;
    28. void fc() {
    29. printf("%d", A + 2);
    30. }
    31. ======================================================================================
    32. main.cpp
    33. #include
    34. #include"b.h"
    35. #include"c.h"
    36. #include
    37. int main() {
    38. fb();
    39. std::cout << "\n" << std::endl;
    40. fc();
    41. return 0;
    42. }
    43. // b.cpp 和 c.cpp 这两个源文件最大的区别就是:他们的头文件 b.h / c.h 并没有 include"a.h"
    44. 这样在 main.cpp 调用 b.cpp / c.cpp 函数做链接时,不会出现 变量A 重复定义的情况。
    45. // 那么 main.cpp文件中 有想使用 变量 A ,就只能 通过 extern 来声明了
    46. // 当编译器遇到 extern 时,就会知道,这个变量是一个外部变量,我应该在 本文件末尾或者其他文件寻找这个变量的定义。

    打印结果 :4  5

  • 相关阅读:
    信号与线性系统分析(吴大正,郭宝龙)(信号的分类)
    精心整理170道Python面试题,建议收藏!
    RabbitMQ事务机制和确认机制
    Ubuntu 22.04 无法使用网易云音乐
    maven常用插件详解
    Scratch二次开发8:背景、角色、造型、声音后台管理
    优化C++资源利用:探索高效内存管理技巧
    geemap学习笔记011:可视化遥感影像随时间的变化
    【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)
    Python编程 元组中不允许的操作
  • 原文地址:https://blog.csdn.net/u013620306/article/details/127883939