2015-11-01 68 views
1

我一直在試圖解決我的多重定義錯誤,最答案似乎是爲extern使用,但即使我做了錯誤仍然存​​在C++多重定義,即使EXTERN

的main.cpp

#include "header.h" 

int main(){ 

ifstream indata; 
indata.open(file.c_str()); 

int x; 

while(indata){ 
    indata >> x; 
    print(x); 
} 

return 0; 
} 

functions.cpp

#include "header.h" 

void print(int x){ 
    cout << x << endl; 
} 

header.h

#ifndef _HEADER_H 
#define _HEADER_H 

#include <fstream> 
#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 

extern string file="testFile.txt"; 

void print(int x); 

#endif 

的Makefile

all: main 

main.o: main.cpp header.h 
    g++ -c main.cpp 

functions.o: functions.cpp header.h 
    g++ -c functions.cpp 

main: main.o functions.o 
    g++ main.o functions.o -o main 

check: all 
    ./main 

clean: 
    rm -f *.o main 

和產生的錯誤消息我得到的是

make 
g++ -c main.cpp 
In file included from main.cpp:1:0: 
header.h:11:15: warning: ‘file’ initialized and declared ‘extern’ 
extern string file="testFile.txt"; 
      ^
g++ -c functions.cpp 
In file included from functions.cpp:1:0: 
header.h:11:15: warning: ‘file’ initialized and declared ‘extern’ 
extern string file="testFile.txt"; 
      ^
g++ main.o functions.o -o main 
functions.o:functions.cpp:(.bss+0x0): multiple definition of `file' 
main.o:main.cpp:(.bss+0x0): first defined here 
collect2: error: ld returned 1 exit status 
Makefile:10: recipe for target 'main' failed 
make: *** [main] Error 1 

有人能指出我朝着正確的方向。

+1

無關的問題,但不包括在報頭的命名空間('使用命名空間x')更多信息:HTTP://。 stackoverflow.com/questions/4872373/why-is-including-using-namespace-into-a-header-file-a-bad-idea-in-c – Unimportant

+0

http://stackoverflow.com/a/30803988/560648 –

回答

1

聲明它header.h:

extern string file; 

而在.cpp文件定義它:

string file = "testFile.txt"; 

否則一切,包括header.h都會有自己的定義file,導致在「文件的多重定義」中出現錯誤。

4

extern聲明被顯示到每一個翻譯單元,而不是定義的一個,

考慮離開只是

extern string file; 

的標題,然後定義移動到源之一文件:

string file = "testFile.txt"; 
1

EXTERN是一個指令告訴鏈接,該符號的定義可在另一個目標文件。 extern是一個聲明說明符 - 即它不是一個定義。你不應該定義一個聲明爲extern的變量。

作爲一種習慣,在頭文件中定義全局變量是不好的。這是多重定義錯誤的原因。這是因爲您的頭文件包含在兩個cpp文件中。

解決方案:

從header.h刪除 的extern字符串文件= 「TESTFILE.TXT」

添加到functions.cpp 字符串文件=「TESTFILE。TXT」

添加到Main.cpp的 extern聲明的extern字符串文件;