知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

C语言中只声明不定义的变量是没有任何的存储空间的是吧?

发表时间:2022-03-25来源:网络

这个问题挺有意思的。

因为C/C++中的声明很多时候都是定义,只是声明而不是定义的情况不多,比如:

通过extern关键字声明外部链接,且无初始化定义函数声明,且无函数体结构体/类声明,且无成员列表

既然题目说的是变量,就以extern为例看一下变量的情况。

(感谢评论区C语言律师大大的指证,请自行将下文“全局变量”替换为“文件作用域变量”,“局部变量”替换为“函数/块作用域变量”,谢谢!)

1. 以extern声明的全局变量或局部变量,只声明不定义,且不使用时,是没有为它分配存储空间的。

2. 以extern声明的全局变量或局部变量,只声明不定义,且使用到了,则需要链接。如果其他源文件中没有定义,则出现链接错误;如果有定义,则其空间显示在出现其定义的源文件所编译出的目标文件中。

3. 以extern声明的全局变量或局部变量,声明且定义,是有分配存储空间的。(不符合题主描述的情况)

4. 不加extern的全局变量声明,因为其声明就是定义,所以无编译器优化时是有存储空间的。(不符合题主描述的情况)

5. 不加extern的局部变量声明(同时也是定义),如果不使用,则可能不在栈上分配空间。(不符合题主描述的情况)

gcc似乎没有分配栈上空间给x,因为y是直接从rbp-4开始的。clang分配了栈上空间,并且初始化为0了。

6. 在函数内声明extern,因为extern声明的变量一定是静态存储器(或C++11起可能为线程存储期),所以与1,2相同。

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜