2017-10-24 1 views
1

그냥 간단한 질문에 선언 :전역는 이해 H 파일과 그들에게 접근

변수 extern int x_glob가 헤더 glob.h에 선언되어있다. 나는이 같은 agin을 정의 할 필요가이 변수를 사용하여 glob.h에 선언 된 기능을 포함하는 모든 C 파일에

너무 :

extern void func_1(void) 
{ 
    int x_glob; 

    glob_x++; 
    return(); 
} 

는 것이 맞습니까?

x_glob의 선언에서 extern 단어를 glob.h으로두면이 정의가 필요하지 않습니다.

extern 단어를 헤더 파일에서 제외하지 않습니까?

어쩌면이 질문은 어리석은 것처럼 들리겠습니까 - 내 목표는 프로젝트가 성장함에 따라 내 프로그래밍 에 더 나은 구조를 얻는 것입니다.

+0

코드에서 더 나은 구조화를 원할 경우 가능한 한 멀리 전역으로 전자 메일을 시작하십시오. – Devolus

답변

3

아니요, 잘못되었습니다. 함수 내에서 int x_glob을 사용하면 로컬 자동 변수를 선언합니다. 이것은 모든 전역 변수를 겹쳐 씁니다.

그러나 정확하게 하나 개의 .c 파일에서 전역 변수를 선언해야합니다

는 :

// main.c 

int x_glob; 

이 이제 모든 모듈에서 사용할 수있는 하나 개의 변수를 생성합니다. 변수의 extern 버전은이 변수가있는 다른 모듈을 컴파일 할 때 컴파일러에게 알려주며 모듈을 가변 변수에 연결할 때 발견됩니다.

개인적으로 나는 다음과 같은 설정을 선호 : x_globextern으로 알려진 모든 모듈에서

// glob.h 
#ifndef EXTERN 
#define EXTERN extern 
#endif 
EXTERN int x_glob; 

// module.c 
#include "glob.h" 

// main.c 
#define EXTERN 
#include "glob.h" 

을 메인에가 통근되지 않습니다 때문에 글로벌 변수에 대한 스토리지를 선언합니다.

+1

"* 적어도 *"-> "* 정확하게 *". 그렇지 않으면 여러 정의에 대해 링크가 실패합니다. –

+0

내 친구에게 고맙습니다. 숲을 볼 수있는 나무가 너무 많았습니다. – dagute

+0

@Dagute, 왼쪽의 버튼을 클릭하여 대답을 수락하십시오. 도움이되어 기쁘다. –

관련 문제