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