const和内部链接性

纵使微芒如烟 2019-06-14 11:48:02



1. 按照c++的语法,const修饰的全局变量默认是具有内部链接性的,我在const.cpp文件中声明声明extern const char *testConst; 是ok的,内部链接性?然后这样是声明时:extern char * testConst;是找不到链接,我有点没懂?

2. const关键字,可以const const const ...
...全文
251 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
[root@VM_0_9_centos extern]# cat main.cpp       
#include<iostream>


void test1(){
extern const char const_var[100];
std::cout<<const_var<<std::endl;
}


const char const_var[100] = "文件作用域.main.cpp";

void test2(){
extern const char const_var[100];
std::cout<<const_var<<std::endl;
}



int main(){

test1();
test2();

return 0;
}
[root@VM_0_9_centos extern]# ./a.out
全局作用域
文件作用域.main.cpp
[root@VM_0_9_centos extern]#


[root@VM_0_9_centos extern]# cat var_def.cpp 
const char const_var[100] = "全局作用域";
[root@VM_0_9_centos extern]# cat main.cpp
#include<iostream>


void test1(){
extern const char const_var[100];
std::cout<<const_var<<std::endl;
}


const char const_var[100] = "文件作用域.main.cpp";

void test2(){
extern const char const_var[100];
std::cout<<const_var<<std::endl;
}



int main(){

test1();
test2();

return 0;
}
[root@VM_0_9_centos extern]# g++ main.cpp var_def.cpp
/tmp/ccUZyhQQ.o: In function `test1()':
main.cpp:(.text+0x5): undefined reference to `const_var'
collect2: error: ld returned 1 exit status
[root@VM_0_9_centos extern]#



正好符合符号解析在作用域上由内向外的特点:局部作用域->文件作用域->全局作用域
纵使微茫如烟 2019-06-18
  • 打赏
  • 举报
回复
引用 9 楼 sdghchj 的回复:
比较一下下面4段代码:



const double const_var3 = 33.33;

int main(){

extern const double const_var3; //链接正常

return 0;
}






int main(){

extern const double const_var3; //链接异常

return 0;
}


const double const_var3 = 33.33;





extern const double const_var3;

int main(){

extern const double const_var3; //链接正常

return 0;
}


const double const_var3 = 33.33;






int main(){

extern const double const_var3; //链接正常

return 0;
}


extern const double const_var3 = 33.33;



结论:
1. const定义的变量的作用域是文件级别的,并且是从定义位置处开始的
2. extern const 定义的变量为可外链的全局const变量。
3. 有extern但没有初始化的变量为变量声明。


[root@VM_0_9_centos src]# cat extern_.cpp 
extern const double const_var3;

int main(){

extern const double const_var3; //链接正常
std::cout<<const_var3<<std::endl;
return 0;
}


const double const_var3 = 33.33;
[root@VM_0_9_centos src]# g++ extern_.cpp
extern_.cpp: In function ‘int main()’:
extern_.cpp:6:2: error: ‘cout’ is not a member of ‘std’
std::cout<<const_var3<<std::endl;
^
extern_.cpp:6:25: error: ‘endl’ is not a member of ‘std’
std::cout<<const_var3<<std::endl;
^
[root@VM_0_9_centos src]#
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
补充:

[root@VM_0_9_centos src]# cat extern.cpp
#include<iostream>




int main(){


extern int a;
return 0;
}
[root@VM_0_9_centos src]# g++ extern.cpp
[root@VM_0_9_centos src]# ./a.out
[root@VM_0_9_centos src]#
[root@VM_0_9_centos src]#
[root@VM_0_9_centos src]# vi extern.cpp
[root@VM_0_9_centos src]# cat extern.cpp
#include<iostream>




int main(){


extern int a;
return 0;
}

const int a = 100;
[root@VM_0_9_centos src]# g++ extern.cpp
[root@VM_0_9_centos src]# ./a.out
[root@VM_0_9_centos src]# vi extern.cpp
[root@VM_0_9_centos src]# cat extern.cpp
#include<iostream>




int main(){


extern const int a;
std::cout<<"a = "<<a<<std::endl;
return 0;
}

const int a = 100;
[root@VM_0_9_centos src]# g++ extern.cpp
/tmp/ccThZOdz.o: In function `main':
extern.cpp:(.text+0xb): undefined reference to `a'
collect2: error: ld returned 1 exit status
[root@VM_0_9_centos src]#


纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
引用 9 楼 sdghchj的回复:
比较一下下面4段代码:


const double const_var3 = 33.33; 

int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}




int main(){

     extern const double const_var3; //链接异常
 
     return 0;
}


const double const_var3 = 33.33; 



extern const double const_var3;

int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}


const double const_var3 = 33.33; 




int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}


extern const double const_var3 = 33.33; 

结论: 1. const定义的变量的作用域是文件级别的,并且是从定义位置处开始的。 2. extern const 定义的变量为可外链的全局const变量。 3. 有extern但没有初始化的变量为变量声明。
const double const_var3 = 33.33; int main(){ extern const double const_var3; //链接正常 return 0; } 对于这段代码,没有意义,其原因在于这里只是对 于 extern const double const_var3; //链接正常 在此处只是一个声明,并没有发生链接过程,这个声明的符号并没有链接到上面的定义。在编译以后会像注释一样被删除
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
外部链接性的创建:"具有外部链接性的对象应在全局作用域内使用extern加以说明,并进行初始化或定义。"---------《c++语法详解》

全局对象默认是外部链接的
static或const对象是内链的


提及 2019-06-18
  • 打赏
  • 举报
回复
引用
2. extern const 定义的变量为可外链的全局const变量。
通过符号表发现 const int 和 static const int是一样的,但是 const int 却可以使用 extern 使其变成全局变量
提及 2019-06-18
  • 打赏
  • 举报
回复
划掉就可以看出 const 和 static 具有同样的效果,符号类型一样,符号名一样“ 是 const 和 static const 一样(ps:符号名都一个样
sdghchj 2019-06-18
  • 打赏
  • 举报
回复
比较一下下面4段代码:


const double const_var3 = 33.33; 

int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}




int main(){

     extern const double const_var3; //链接异常
 
     return 0;
}


const double const_var3 = 33.33; 



extern const double const_var3;

int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}


const double const_var3 = 33.33; 




int main(){

     extern const double const_var3; //链接正常
 
     return 0;
}


extern const double const_var3 = 33.33; 

结论: 1. const定义的变量的作用域是文件级别的,并且是从定义位置处开始的。 2. extern const 定义的变量为可外链的全局const变量。 3. 有extern但没有初始化的变量为变量声明。
提及 2019-06-18
  • 打赏
  • 举报
回复
补充

extern const int ecp = 99;
const int cp = 99;
static const int scp = 99;

int g_i = 9;
static int sg_i = 9;

0000000000000000 R ecp
0000000000000004 r _ZL2cp
0000000000000008 r _ZL3scp

0000000000000000 D g_i
0000000000000004 d _ZL4sg_i

const int cp = 99;
static const int scp = 99;
0000000000000004 r _ZL2cp
0000000000000008 r _ZL3scp
就可以看出 const 和 static 具有同样的效果,符号类型一样,符号名一样
提及 2019-06-18
  • 打赏
  • 举报
回复


extern const int ecp = 99;
const int cp = 99;

int g_i = 9;
static int sg_i = 9;

0000000000000000 R ecp
0000000000000004 r _ZL2cp

0000000000000000 D g_i
0000000000000004 d _ZL4sg_i



提及 2019-06-18
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
是什么给了你 cosnt 和具有内部链接的错觉??
还真是 https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2010/f6xx1b1z(v=vs.100) test.cpp:6:对‘p’未定义的引用
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj的回复:
自己区分一下 const char *testConst 和 char * const testConst
然后报考了了下https://blog.csdn.net/g5dsk/article/details/5772605这篇博客,有了和博主一样的疑惑,请教下
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678的回复:
是什么给了你 cosnt 和具有内部链接的错觉??
确实如此,请参考https://blog.csdn.net/g5dsk/article/details/5772605 或者《c++语法详解》p171
纵使微芒如烟 2019-06-18
  • 打赏
  • 举报
回复
@sdghchj, 恍惚了,谢谢

@lin5161678,难道不是?https://blog.csdn.net/g5dsk/article/details/5772605
lin5161678 2019-06-17
  • 打赏
  • 举报
回复
是什么给了你 cosnt 和具有内部链接的错觉??
sdghchj 2019-06-17
  • 打赏
  • 举报
回复
自己区分一下 const char *testConst 和 char * const testConst

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧