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

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

e.g.

在a.h中:

 extern const int a;

在a.c中:

 const int a = ;

在main.c中:

 #include<stdio.h>
#include"a.h" int main()
{
printf("%d\n",a);
}

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 中的

 const int a = 10;

改为:

 extern const int a = ;

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

c与c++中的extern const的区别和联系的更多相关文章

  1. C++中define与const的区别

    C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...

  2. ES6中var/let/const的区别

    let的含义及let与var的区别: let 声明的变量只在它所在的代码块有效: 如下: for (let i = 0; i < 10; i++) { console.log(i); } con ...

  3. c++中 #define和const的区别

    来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364 这个区别用从几个角度来说: 角度1: 就定义常量说的话:  const 定 ...

  4. Es6中let与const的区别:(神奇的块级作用域)

    所谓的块级作用域:形成一个暂时性的死区:{    } 一.共同点: a:都是用来声明变量: b:都能形成一个块级作用域: c:都只能在声明变量的块级作用域里面有效: 二.不同点: 1.let: a:在 ...

  5. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  6. extern const 不能一起用

    转载至:https://www.cnblogs.com/herenzhiming/articles/5442893.html 常变量在定义的时候必须初始化,所以当你在a.cpp中定义extern co ...

  7. OC中的extern,static,const

    const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...

  8. C++项目中的extern "C" {}

    from:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html C++项目中的extern "C" {} 20 ...

  9. C、C++中const的区别

    C语言中: 被const修饰的变量,仍然是变量.虽然不能用C语法给这个变量改变值,但他本质上还是变量. C编译器会给它分配空间. C中,const默认使用的是外部链接. C++中: 被const修饰的 ...

随机推荐

  1. [ACM_其他] 总和不小于S的连续子序列的长度的最小值——尺缩法

    Description: 给定长度为n的整数数列,A[0],A[1],A[2]….A[n-1]以及整数S,求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. Input: 输入数据有 ...

  2. AngularJS快速入门指南10:DOM节点

    AngularJS通过指令将application数据绑定到HTML DOM元素的属性上. ng-disabled指令 ng-disabled指令将AngularJS application数据绑定到 ...

  3. js笔记:匿名函数

    ;(function(){ alert('啥也没做');})(); 会弹框. 这是个匿名函数.最前面的分号可以去掉,仅仅是在代码压缩时防止出错. 该函数可以拆解成非匿名函数: var a= funct ...

  4. paip.log4j 日志系统 参数以及最佳实践

    paip.log4j 日志系统 参数以及最佳实践   %d{yyyy-MM-dd HH:mm:ss} [thrd:%t] %5p   loger:%c   (%C.%M.%L)  - %m%n 201 ...

  5. js脚本语言基础和数组

    js和PHP中,字符串赋值:要使用"双引号"或"单引号"引起来:例如:var c="你好"不同类型进行数学运算,要转换,类型转换:强制转换p ...

  6. iOS开发---百度地图配置流程,2.6.0 版本 支持64位

      1.首先需要在百度地图下载最新SDK:地址: http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 2. ...

  7. Leetcode 326 Power of Three 数论

    判断一个数是否是3的n次幂 这里我用了一点巧,所有的int范围的3的n次幂是int范围最大的3的n次幂数(即3^((int)log3(MAXINT)) =  1162261467)的约数 这种方法是我 ...

  8. canvas之特丑时钟

    感觉是不是特想送钟,老是编写些时钟的效果,今日就发个丑丑的时钟,老实说 有没有什么调试canvas的工具,老是要在浏览器刷新查看效果,好累啊~ (┬_┬) 代码: <!DOCTYPE html& ...

  9. LPC43xx I2S

  10. mac电脑如何不生成.DS_STORE文件

    执行这个命令,然后重启 defaults write com.apple.desktopservices DSDontWriteNetworkStores true