• C++ extern关键字理解


    extern是什么及其作用

    extern是c++引入的一个关键字,它可以应用于一个全局变量,函数或模板声明,说明该符号具有外部链接(external linkage)属性。也就是说,这个符号在别处定义。一般而言,C++全局变量的作用范围仅限于当前的文件,但同时C++也支持分离式编译,允许将程序分割为若干个文件被独立编译。于是就需要在文件间共享数据,这里extern就发挥了作用。

    extern的用法

    extern有3种用法,分别如下:

    非常量全局变量的外部链接

    1. //fileA.cpp
    2. int i = 1; //声明并定义全局变量i
    3. //fileB.cpp
    4. extern int i; //声明i,链接全局变量
    5. //fileC.cpp
    6. extern int i = 2; //错误,多重定义
    7. int i; //错误,这是一个定义,导致多重定义
    8. main()
    9. {
    10. extern int i; //正确
    11. int i = 5; //正确,新的局部变量i;
    12. }

    常量全局变量的外部链接

      常量全局变量默认是内部链接的,所以想要在文件间传递常量全局变量需要在定义时指明extern,如下所示:

    1. //fileA.cpp
    2. extern const int i = 1; //定义
    3. //fileB.cpp //声明
    4. extern const int i;

    extern "C" 和extern "C++"函数声明

    1. // 声明printf函数使用C链接
    2. extern "C" int printf(const char *fmt, ...);
    3. //声明指定的头文件内所有的东西都使用 C 链接
    4. extern "C" {
    5. #include
    6. }
    7. // 声明函数ShowChar和GetChar使用 C 链接
    8. extern "C" {
    9. char ShowChar(char ch);
    10. char GetChar(void);
    11. }
    12. // 定义函数 ShowChar 和 GetChar 使用 C 链接
    13. extern "C" char ShowChar(char ch) {
    14. putchar(ch);
    15. return ch;
    16. }
    17. extern "C" char GetChar(void) {
    18. char ch;
    19. ch = getchar();
    20. return ch;
    21. }
    22. // 声明全局变量 errno 为C链接
    23. extern "C" int errno;
    24. //又比如,在程序中常见的代码段
    25. #ifdef __cplusplus
    26. extern "C" {
    27. #endif
    28. /**** some declaration or so *****/
    29. #ifdef __cplusplus
    30. }
    31. #endif
    32. //这里__cplusplus是cpp中的自定义宏,定义了这个宏就表明这是一段cpp的代码,也就是说,//上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

     

    使用extern和包含头文件来引用函数有什么区别?

      与include相比,extern引用另一个文件的范围小,include可以引用另一个文件的全部内容。extern的引用方式比包含头文件要更简洁。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

    注意事项

    • 不要把变量定义放入.h文件,这样容易导致重复定义错误
    • 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
    • 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
  • 相关阅读:
    stm32-SPI协议
    如何在网页中实现动画效果
    测试人不得不知道的自动化知识
    Vue框架学习记录
    Uniapp从零开始,手把手教学(附精选源码32套,涵盖商城团购等)
    数据结构:二叉排序树
    堆排序
    pg_dump执行流程简单记录
    中国女士职业套装行业深度调研及投资前景预测研究报告
    轻量级的日志采集组件 Filebeat 讲解与实战操作
  • 原文地址:https://blog.csdn.net/sono_io/article/details/128149527