2015-10-25 17 views
1

(道歉,如果它是簡單,我只是失明。)無法找到未定義的引用與外部變量(DEV C++)

main.cpp中:

#include "a.h" 

int main() 
{ 
    x = 4 ; 
} 

啊:

extern int x ; 

(出於某種原因,第一編譯這段代碼工作,但不是第二個

旁邊的問題:偶爾我遇到問題,我需要編譯兩次代碼才能工作。我是否有編譯器問題?)

回答

1

如您所知,構建C或C++程序涉及三個步驟:預處理,編譯和鏈接。這是一個簡單的,非技術性的描述。

  1. 預處理

preprocessor將取代#include "a.h"與回曆文件的內容逐字這導致

extern int x; 

int main() 
{ 
    x = 4; 
} 
  • 編譯
  • 編譯器處理該預處理器的輸出。 extern int x;僅爲聲明,而不是定義。它告訴編譯器它可以相信空間被保留用於x類型的變量int。 (extern x表示x有所謂的external linkage。)編譯器生成的代碼將此變量設置爲4,但標記代碼以在鏈接器確定其定義的位置時要求鏈接器填寫實際位置x

  • 鏈接
  • 接頭處理由在前面的步驟中的編譯器生成的目標文件。它尋找x的實際定義,但找不到(x僅被聲明但從未定義),併發出未定義的符號錯誤。

    如果你想看到extern在行動上,只需創建一個第三個文件,說b.cpp

    // b.cpp 
    int x; 
    

    如果現在建立由main.cppb.cpp程序,鏈接器錯誤消失。 b.cpp定義爲x,因此鏈接程序將選取此定義並填入由編譯main.cpp生成的佔位符代碼中x的位置,其中它被設置爲4。

    至於方面的問題:我認爲你的問題編譯有時成功,有時不成功可能是由於操作員的部分錯誤:-)