C/C++头文件与变量的声明和定义
?
版權聲明:本文為博主轉載文章,遵循?CC 4.0 BY-SA?版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/mountzf/article/details/51767353
最近遇到了變量重復包含的問題,才發現自己有好多知識已經模糊了,真慚愧。首先說下頭文件,其實頭文件對計算機而言沒什么作用,她只是在預編譯時在#include的地方展開一下,沒別的意義了,頭文件主要作用有兩個:一是把很多其他文件需要重復使用的函數變量等在此聲明,在需要的地方include;二是給使用你函數文件的人看的。那既然是說明,那么頭文件里面放的自然就是關于函數,變量,類的“聲明”了。記著,是“聲明”,不是“定義”。
那么,大家知道聲明和定義的區別。所以,最好不要在頭文件里定義什么東西。比如全局變量:
那么,很糟糕的是,這里的int A是個全局變量的定義,如果這個頭文件被多次引用的話,你的A會被重復定義。
變量的定義:為變量分配存儲空間,同時指明變量的類型和名字。另外變量的初始化,就是在變量的定義出給出值。
變量的聲明:它主要向程序聲明變量的類型和名字。定義也是聲明(這是許多人搞不清楚的地方),那既然變量的定義就是聲明,為啥還要再多出來個變量的聲明這個概念,直接就用變量的定義不是就可以了?
其實不然,C++中有個關鍵字是用來聲明變量的,它是extern。它聲明一個變量卻不定義它,即不在給它一個存儲空間。要在包含該文件的文件中使用此變量應該聲明全局變量“extern int A”。
頭文件中變量如果沒有初始化就是聲明;初始化了就是定義,此時被包含之后會發生重復定義的錯誤。全局變量的定義宜放在某個 .c 文件中,而 .h 文件里寫的是變量的聲明。頭文件應用于聲明而不是用于定義。
其實,C++標準并沒有規定頭文件中不能定義 變量,只不過如果在頭文件中定義變量,而該頭文件又被多次包含的話,會造成變量的重新定義。這和頭文件中的函數聲明不同,因為函數在頭文件中僅僅是聲明,聲明可以有多個,但是無論是函數還是變量定義都只能有一個,否則就會發生重復定義的錯誤。
并不是所有的變量都能用extern聲明,只有全局變量并且沒有被static 聲明的變量才能聲明為extern. 所以如果你不想自己源文件中全局的變量被其他文件引用,你就可以給變量加上static聲明。
非const變量默認為extern const變量默認為文件的局部變量。而const變量如果想要在其他文件里被訪問,必須顯示的指定它為extern。如果const對象在編譯時可以確定其值,可以將其放在頭文件中定義。這么做是有原因的——const對象默認情況下是定義該變量的文件的局部變量,這樣即使此頭文件被多個包含,都不會在包含這些文件中重復定義此變量,所有對于這個const對象的引用全都指向在頭文件中定義的對象。如果在const對象定義的時候聲明extern,const對象就變得和普通非const對象一樣,從而失去此特性(非const對象的默認屬性為extern)。
所以,總結如下:
- 如果是要定義全局變量,那么在頭文件中用extern關鍵字聲明,然后在另一個.cpp文件中定義;
- 如果是要聲明一個不想被其他文件使用、只能被本文件使用的變量,可以用static關鍵字在頭文件中進行定義;
- 如果所要定義的變量為局部變量,并且其值在編譯時就已經可以確定,就可以用const關鍵詞在頭文件中進行定義。
祝楓
2016年6月27日于深圳
總結
以上是生活随笔為你收集整理的C/C++头文件与变量的声明和定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度 CTO 王海峰:飞桨 AI 平台生
- 下一篇: 散户可以买1亿股票吗?