2013-05-03 88 views
0

所以這是我的defs.h是如何構成的:頭文件結構

#ifndef DEF_H 
#define DEF_H 
#include <stdio.h> 

... 

int var = 20; 
int test = 1; 

... 

#endif 

現在,我的main.c和util.c,全部用:

#include "defs.h" 

這是我的makefile :

all: clean compile 

compile: clean main 
    @echo SUCCESS: COMPILED FILES 

main: main.o util.o 
    cc main.o util.o -o progname 

main.o: main.c 
    cc -o main.o -c main.c 

util.o: util.c 
    cc -o util.o -c util.c 

clean: 
    -rm -rf *.a *.o *.so progname 
    @echo SUCCESS: CLEANED FILES 

然而,當我運行make,無論是目標文件編譯罰款,但在做最後的鏈接時,我不斷收到:

util.o:(.data+0x0): multiple definition of `var' 
main.o:(.data+0x0): first defined here 

我是第結構出問題了嗎?任何幫助,將不勝感激。

感謝

+0

參見[什麼在C'extern'變量(http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/)。 – 2013-05-03 20:21:12

回答

2

是的,你應該讓你的全局變量,在您的實現文件(.c)中。如果您將它們放在標題中,那麼它們會包含在多個實現文件中,並且會出現多重定義錯誤。

更好的是,你的程序中不應該有任何全局變量。

3

是的,你正在構造錯誤的東西。

對於任何特定變量,您可能有幾個聲明,但只有一個定義。通過將變量的定義放在標題中,您違反了此規則。假設您的標題包含在每個標題中,則現在您在mainutil翻譯單元中都有定義。

正確的圖案是將extern int var;在頭,從而提供了聲明每翻譯單元,其包括的報頭;和int var = 20;恰好一個你的源代碼文件,從而提供了一個定義。

+0

我做了這個,現在我得到了「util.c :(。text + 0x346):未定義的引用var'」 – Pat 2013-05-03 20:16:27

+0

現在你缺少'int var = 20;'。它應該在文件範圍內放入一個'.c'文件中。 – 2013-05-03 20:36:20