C++头文件保护符和变量的声明定义
1、#ifndef?#define?#endif頭文件保護符
在編譯的過程中,每個.cpp文件被看成一個單獨的文件來編譯成單獨的編譯單元,#ifndef?保證類的頭文件在同一個.cpp文件里被多次引用后不會出現重定義問題。
注意:僅僅是防止在同一個.cpp文件里被多次引用。
樣例:
// file1.h class file1 { };// file2.h #include "file1.h" class file2 { };// file3.h #include "file1.h" #include "file2.h"
file3.h展開來是這種:
// file1.h展開的內容 class file1 { }; // file2.h展開的內容 class file1 { }; class file2 { };
這時候就會出現重定義了,假設在每一個文件加上#ifndef頭文件保護符:
// 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_
這時候展開file3.h時,由于_FILE1_H_僅僅會被定義一次。所以就不會出現重定義錯誤。
2、變量的聲明和定義
定義:用于為變量分配存儲空間,還能夠為變量指定初始值。在一個程序中,變量有且僅有一個定義。
聲明:用于向程序表明變量的類型和名字。在一個程序中。聲明能夠有多個。定義也是聲明:當定義變量時我們聲明了它的類型和名字。能夠通過使用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; }
這時候編譯會報錯,由于在file1.h定義了a。在file2.h的展開中又定義了a。
有人會問。#ifndef不是防止重定義的嗎?#ifndef是防止在同一個文件的重定義,在上面的情況,file1.h和file2.h是兩個不同的文件。所以會在file1.h和file2.h同一時候出現int?a?=?1,就出現重定義錯誤了。
所以不要在頭文件定義變量,最好的做法是:在頭文件聲明變量,在.cpp定義變量,在須要使用該變量的地方先聲明再使用。
改動下上面的樣例:
// 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不變。這時候就能夠正常執行了。
3、能夠在頭文件定義的三個例外
(1)類的定義。
類的定義很多其它像是聲明,由于此時并沒有分配空間。
(2)值在編譯時就已知的const對象。
如:const char c = 'c';,這個是在編譯時就已經確定值的。之后程序不能改變。
而const char *c = 'c';是不能夠的,由于指針不是在編譯時確定值的。
(3)inline內聯函數。
轉載于:https://www.cnblogs.com/bhlsheji/p/5116129.html
總結
以上是生活随笔為你收集整理的C++头文件保护符和变量的声明定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现ABP中Person类的权限功能
- 下一篇: VS2010 C++ 插件 Vissua