通常,現在寫代碼時都會隨手在頭文件中加入頭文件保護符。有以下兩種形式的保護符。
#ifndef ABCDE#define ABCDE//..... 內容#endif#PRagma once兩種模式的作用是相同的,都是只讓頭文件在解析過程中只會展開一次。能工作的循環包含情況
今天遇到的問題是循環包含問題,也就是說如下例子
//********************************* a.h 文件#pragma once#include <iostream>#include "b.h"using namespace std;int a = 1;//********************************* b.h文件#pragma once#include "a.h"int b = 1;這是雖然有循環包含,但是由于有頭文件保護符的作用,則兩者之間是不沖突的,假設存在以下cpp文件:#include "a.h"#include "b.h"int main(){ cout << a << endl; cout << b << endl;}根據 cpp 文件中包含的頭文件的順序,則該cpp 文件會被展開為如下情況://-----------------------------------#include "a.h"#include <iostream>//----------------------#include "b.h"int b = 1;//----------------------using namespace std;int a = 1;//------------------------------------int main(){ cout << a << endl; cout << b << endl;}可以看出,該代碼的使用完全沒有問題、
出錯的循環包含情況
但是如果出現以下這種情況,則循環包含會出錯,且報錯都是編譯解析錯誤,即分號錯誤,<號錯誤等毫無問題的錯誤。
//**************************************** a.h 文件#pragma once#include "b.h";#include <iostream>using namespace std;class A {};//*************************************** b.h 文件#pragma once#include "a.h"class B { A * aptr;};cpp文件如下:
#include "a.h"#include "b.h"int main() {}此時報錯就比較迷離了。會出現錯誤如下:
錯誤 C2143語法錯誤: 缺少“;”(在“*”的前面)Project2d:/文檔/visual studio 2015/projects/project2/project2/b.h5
錯誤 C2238意外的標記位于“;”之前Project2d:/文檔/visual studio 2015/projects/project2/project2/b.h5
分析時嘗試將兩個頭文件展開在cpp文件中,展開結果如下
//------------------------#include "a.h"//-----------#include "b.h"class B{ A * aptr;};//------------#include <iostream>using namespace std;class A{};//---------------------------int main(){}此時可以明顯看出,問題出現在,當將頭文件按其各自在cpp中聲明的順序展開時,會出現在 class B 中,類型 A 未經過聲明就使用了的情況。
這個問題難在三個點上:
1. 編譯器報錯的地方很奇怪,說是分號錯誤類似的問題,根本無從定位2. 這個問題在包含順序變動后很可能就消失了,但是弊端還是存在的。假設上例中 cpp 文件先包含 b.h 再包含 a.h ,則就沒有問題
3. 若是不止兩個頭文件間發生了循環包含,而是多個頭文件循環包含,則問題更難定位。如 a 包含 b,b 包含 c,c 包含 a,則比較隱晦。
反思
說明:通常在面向對象編程中,我們在頭文件中都是定義類,若兩個頭文件包含,則說明兩個頭文件中包含的兩個類之間關系高度耦合。即A 需要 B , B 需要 A。依照《重構》中的思想,這種情況屬于代碼臭味,需要考慮將這兩個類中的內容合并為一個類,之后將不存在循環包含的情況。類之間通常是單向依賴關系,雙向依賴關系意味著臭味,需要對代碼進行拆分重組,因此當出現循環包含時,應當考慮代碼重構。
轉載請標明出處:http://blog.csdn.net/virtual_func
新聞熱點
疑難解答
圖片精選