• c与c++中的extern const的区别和联系


    最近复习c++,发现了这个东西。

    c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefined reference错误,这是因为在c语言里面,const全局变量在符号表里面是GLOBAL即全局可见的,而在c++里面却是LOCAL即只能在当前编译模块可见。

    e.g.

    在a.h中:

    1 extern const int a;

    在a.c中:

    1 const int a = 10;

    在main.c中:

    1 #include<stdio.h>
    2 #include"a.h"
    3 
    4 int main()
    5 {
    6     printf("%d
    ",a);
    7 }

    gcc a.c main.c -o main

    编译成功,输入./main输出10

    我们使用gcc -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:

    可以看到最后一行,a在符号表中是GLOBAL的。

    接下,我们不用改动代码,只是使用g++ a.c main.c -o main来编译程序,可以看到出错:

    链接出错,原因是找不到a的定义,

    使用g++ -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:

    Num为6的那行表明,a变成了一个LOCAL对象,只能在a.o中可见,对main.o不可见。

    解决方法:

    将a.c 中的

    1 const int a = 10;

    改为:

    1 extern const int a = 10;

    这样g++编译器在第一次看到a的定义的时候,因为存在extern关键字,就把它当成GLOBAL对象写入符号表:

  • 相关阅读:
    安装好k8s后,使用kubectl get cs 查看状态,发现 controller-manager scheduler Unhealthy
    k8s 去掉node标签 难去的
    项目中常用到的布局 flex
    scanf输入空格
    sed和awk学习第一天
    线程池
    线程间通信 | 等待唤醒机制
    创建线程的三种方法详细对比
    EXCEL中VLOOKUP函数的使用
    Vulnhub实战靶场:GAARA: 1
  • 原文地址:https://www.cnblogs.com/ylan2009/p/4279855.html
Copyright © 2020-2023  润新知