C++头文件保护符和变量的声明定义
1、#ifndef?#define?#endif頭文件保護(hù)符
在編譯的過(guò)程中,每個(gè).cpp文件被看成一個(gè)單獨(dú)的文件來(lái)編譯成單獨(dú)的編譯單元,#ifndef?保證類(lèi)的頭文件在同一個(gè).cpp文件里被多次引用后不會(huì)出現(xiàn)重定義問(wèn)題。
注意:僅僅是防止在同一個(gè).cpp文件里被多次引用。
樣例:
// file1.h class file1 { };// file2.h #include "file1.h" class file2 { };// file3.h #include "file1.h" #include "file2.h"
file3.h展開(kāi)來(lái)是這種:
// file1.h展開(kāi)的內(nèi)容 class file1 { }; // file2.h展開(kāi)的內(nèi)容 class file1 { }; class file2 { };
這時(shí)候就會(huì)出現(xiàn)重定義了,假設(shè)在每一個(gè)文件加上#ifndef頭文件保護(hù)符:
// file1.h #ifndef _FILE1_H_ #define _FILE1_H_class file1 { };#endif // !_FILE1_H_
// file2.h #ifndef _FILE2_H_ #define _FILE2_H_#include "file1.h" class file2 { };#endif // !_FILE2_H_
// file3.h #ifndef _FILE3_H_ #define _FILE3_H_#include "file1.h" #include "file2.h"#endif // !_FILE3_H_
這時(shí)候展開(kāi)file3.h時(shí),由于_FILE1_H_僅僅會(huì)被定義一次。所以就不會(huì)出現(xiàn)重定義錯(cuò)誤。
2、變量的聲明和定義
定義:用于為變量分配存儲(chǔ)空間,還能夠?yàn)樽兞恐付ǔ跏贾怠T谝粋€(gè)程序中,變量有且僅有一個(gè)定義。
聲明:用于向程序表明變量的類(lèi)型和名字。在一個(gè)程序中。聲明能夠有多個(gè)。定義也是聲明:當(dāng)定義變量時(shí)我們聲明了它的類(lèi)型和名字。能夠通過(guò)使用externkeyword聲明變量名而不定義它:extern?int?i;。
樣例:
// file1.h #ifndef _FILE1_H_ #define _FILE1_H_int a = 1;#endif // !_FILE1_H_
// file2.h #ifndef _FILE2_H_ #define _FILE2_H_#include "file1.h"#endif // !_FILE2_H_
// main.cpp #include <iostream>int main() {extern int a;std::cout << a << std::endl;system("pause");return 0; }
這時(shí)候編譯會(huì)報(bào)錯(cuò),由于在file1.h定義了a。在file2.h的展開(kāi)中又定義了a。
有人會(huì)問(wèn)。#ifndef不是防止重定義的嗎?#ifndef是防止在同一個(gè)文件的重定義,在上面的情況,file1.h和file2.h是兩個(gè)不同的文件。所以會(huì)在file1.h和file2.h同一時(shí)候出現(xiàn)int?a?=?1,就出現(xiàn)重定義錯(cuò)誤了。
所以不要在頭文件定義變量,最好的做法是:在頭文件聲明變量,在.cpp定義變量,在須要使用該變量的地方先聲明再使用。
改動(dòng)下上面的樣例:
// file1.h #ifndef _FILE1_H_ #define _FILE1_H_extern int a;#endif // !_FILE1_H_
// file1.cpp #include "file1.h"int a = 1;
// file2.h #ifndef _FILE2_H_ #define _FILE2_H_#include "file1.h"#endif // !_FILE2_H_
main.cpp不變。這時(shí)候就能夠正常執(zhí)行了。
3、能夠在頭文件定義的三個(gè)例外
(1)類(lèi)的定義。
類(lèi)的定義很多其它像是聲明,由于此時(shí)并沒(méi)有分配空間。
(2)值在編譯時(shí)就已知的const對(duì)象。
如:const char c = 'c';,這個(gè)是在編譯時(shí)就已經(jīng)確定值的。之后程序不能改變。
而const char *c = 'c';是不能夠的,由于指針不是在編譯時(shí)確定值的。
(3)inline內(nèi)聯(lián)函數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/bhlsheji/p/5116129.html
總結(jié)
以上是生活随笔為你收集整理的C++头文件保护符和变量的声明定义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现ABP中Person类的权限功能
- 下一篇: VS2010 C++ 插件 Vissua