2012-12-03 58 views
2

我在程序中有一個非常簡單的文件系統。包含頭文件錯誤:多重定義

有:main.cpp中包括worker.h,worker.h和worker.cpp包括worker.h

worker.h有頭文件保護並已申報一些變量,由兩個主要求.cpp和worker.cpp,它有一些函數聲明。

#ifndef __WORKER_H_INCLUDED__ 
#define __WORKER_H_INCLUDED__ 

    bool x; 
    int y; 

    void somefunction(int w, int e); 

#endif 

通過一些其他線程和谷歌的結果去,我理解的是,頭文件保護保護你免受多次包含在一個單一的源文件,而不是從多個源文件。

所以我可以期待鏈接錯誤。

我的問題是

  1. 爲什麼有隻變量而不是功能的多個定義錯誤?據我的理解,這些都只是聲明和未定義在頭文件worker.h

  2. 如何使一個變量可用於main.cpp和worker.cpp沒有多個定義鏈接器錯誤?

+0

你不應該有這樣的錯誤....你是如何編譯和鏈接你的程序?你使用一些'Makefile'嗎?編譯時是否啓用了所有的警告和調試信息(例如,在Linux上用'g ++ -Wall -g'編譯)? –

+0

@StudentX:你的理解不正確。你*聲明瞭你的函數,但是你定義了你的變量。這就是爲什麼你會得到變量的多重定義錯誤。 – AnT

+0

@Basile Starynkevitch:他*應該*有這樣的錯誤。有些C編譯器會讓這樣的錯誤消失,但C++編譯器通常對多重定義錯誤非常嚴格。 – AnT

回答

3

Why there are multiple definition errors for only variables and not for functions ? As far as my understanding goes both of those are only declared and not defined in the header file worker.h

因爲你定義的變量。這樣他們只宣佈:

extern bool x; 
extern int y; 

但是你必須在cpp文件中定義它們。 :

bool x = true; 
int y = 42; 
+0

而我雖然如果你沒有設置變量的某個值,那麼它是一個聲明。非常感謝。 – StudentX

+0

@StudentX不,設置爲某個值可以確保該變量未保持未初始化狀態,在某些情況下這可能很糟糕。 –