zoukankan      html  css  js  c++  java
  • 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对象写入符号表:

  • 相关阅读:
    Docker导入容器快照,执行报错:docker: Error response from daemon: No command specified.
    git笔记
    数据库设计
    前端项目--配置上下文
    tomcat启动前端项目
    Nginx配置负载均衡
    Nginx使用
    转载自:StringUtils的常见方法
    转载:String.format()的详细用法
    tomcat配置解决乱码问题
  • 原文地址:https://www.cnblogs.com/ylan2009/p/4279855.html
Copyright © 2011-2022 走看看