Program Tip

헤더 파일의 변수 선언

programtip 2020. 12. 10. 21:03
반응형

헤더 파일의 변수 선언


여러 소스에서 사용할 수있는 변수가있는 경우 헤더에 선언하는 것이 좋은 방법입니까? 또는 .c파일 에서 선언하고 extern다른 파일에서 사용 하는 것이 더 낫 습니까?


헤더 파일에서 변수를 선언 해야 합니다.

extern int x;

그런 다음 하나의 C 파일 정의 하십시오.

int x;

C에서 정의와 선언의 차이점은 정의가 변수를위한 공간을 예약하는 반면 선언은 변수를 기호 테이블에 도입 할뿐입니다 (링크 시간과 관련하여 링커가 검색하도록합니다). .


extern헤더 파일에서와 같이 선언하고 정확히 1 개의 .c 파일에서 정의 할 수 있습니다.

.c 파일도 헤더를 사용해야하며 표준 패턴은 다음과 같습니다.

// file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x = 1;    // definition and re-declaration

다음과 같이 선언하면

int x;

여러 위치에 포함 된 헤더 파일에서 여러 x 인스턴스로 끝날 것입니다 (그리고 잠재적으로 컴파일 또는 링크 문제).

이에 접근하는 올바른 방법은 헤더 파일에

extern int x; /* declared in foo.c */

그런 다음 foo.c에서 다음과 같이 말할 수 있습니다.

int x; /* exported in foo.h */

원하는만큼 많은 위치에 헤더 파일을 포함 할 수 있습니다.


핵심은 헤더 파일과 소스 파일의 변수 선언을 동일하게 유지하는 것입니다.

이 트릭을 사용합니다

------sample.c------
#define sample_c
#include sample.h

(rest of sample .c)

------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int x;

Sample.c는 한 번만 컴파일되며 변수를 정의합니다. sample.h를 포함하는 모든 파일에는 변수의 "extern"만 제공됩니다. 해당 변수에 공간을 할당합니다.

x의 유형을 변경하면 모두에게 변경됩니다. 소스 파일과 헤더 파일에서 변경하는 것을 기억할 필요가 없습니다.


이 솔루션은 어떻습니까?

#ifndef VERSION_H
#define VERSION_H

static const char SVER[] = "14.2.1";
static const char AVER[] = "1.1.0.0";

#else

extern static const char SVER[];
extern static const char AVER[];

#endif /*VERSION_H */

내가 보는 유일한 단점은 동일한 파일에 두 번 포함하면 include 가드가 당신을 저장하지 않는다는 것입니다.

참고 URL : https://stackoverflow.com/questions/1164167/variable-declaration-in-a-header-file

반응형