2013-08-21 1 views
4

을 나는 3 개 *.c 파일 (file1.c, file2.cfile3.c) 및 프로젝트 (비주얼 스튜디오) 1 개 *.h 파일 (file3.h)가 포함됩니다.는 가드가 여전히 글로벌 변수를 삽입

/******************************* 
file3.h 
********************************/ 
#ifndef FILE3_H 
#define FILE3_H 
int gintVariable = 400; 
#endif 


/******************************* 
file1.c 
********************************/ 
#include "file3.h" 
#include <stdio.h> 
#include <conio.h> 

int modifyGlobalVariable(void); 
void printGlobalVariable(void); 

int main(void) 
{ 
    modifyGlobalVariable(); 
    printGlobalVariable(); 
    printf("Global variable: %d\n", gintVariable++); 
    getch(); 
    return 0; 
} 


/******************************* 
file2.c 
********************************/ 
#include "file3.h"      

int modifyGlobalVariable(void) 
{ 
    return gintVariable++; 
} 


/******************************* 
file3.c 
********************************/ 
#include "file3.h" 
#include <stdio.h> 

void printGlobalVariable(void) 
{ 
    printf("Global: %d\n", gintVariable++); 
} 

내가 VS에서 솔루션을 빌드 할 때, 그것은로 오류를주고있다.

전 처리기 출력을 확인했는데 gintVariable은 포함 된 경비원을 포함하고 있지만 모든 * .c 파일에 포함되어 있습니다.

내가 뭘하고있는 걸까요?

+2

당신의 실수가 경비원 여러 정의에 대한 보호 등 가정한다. 호기심에서, 당신에게 그 아이디어는 무엇입니까? –

+0

@LuchianGrigore : 포함되지 않은 경비원은 헤더 만 포함합니다. 나 맞아? – OnlyQuestions

+2

동일한 번역 단위의 경우 예. 하지만 하나 이상의 파일을 컴파일하고 있습니까? –

답변

4

여러 포함 방지 읽기 (또는, 더 정확하게는, .H 파일 내용의 여러 편집) 하나의 번역 단위입니다.

은이 문제에 대한 유용

/* glob.h */ 
#ifndef H_GLOB 
#define H_GLOB 

struct s { int i; }; 

#endif 


/* f.h */ 
#ifndef H_F 
#define H_F 

#include "glob.h" 

struct s f(void); 

#endif 


/* g.h */ 
#ifndef H_G 
#define H_G 

#include "glob.h" 

struct s g(void); 

#endif 


/* c.c */ 
#include "f.h" /* includes "glob.h" */ 
#include "g.h" /* includes "glob.h" */ 

void c(void) { 
    struct s s1 = f(); 
    struct s s2 = g(); 
} 

함유 물은 다이아몬드처럼 :

 

    glob.h 
/ \ 
f.h  g.h 
    \ /
    c.c