programing

헤더 파일의 변수 선언

prostudy 2022. 5. 7. 09:31
반응형

헤더 파일의 변수 선언

여러 출처에서 사용할 수 있는 변수가 있는 경우, 헤더로 선언하는 것이 좋은 관행인가?아니면 에 신고하는 것이 더 나은가?.c철하여 사용하다extern다른 파일에 저장하시겠습니까?

머리글 파일에 변수를 선언하십시오.

extern int x;

하나의 C 파일로 정의하십시오.

int x;

C에서 정의와 선언의 차이는 정의가 변수에 대한 공간을 비축하고 있는 반면 선언은 단지 기호 표에 변수를 도입할 뿐이다(그리고 링크 시간에 관한 한 Linker가 그것을 찾도록 할 것이다).

라고 선언해야 한다.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를 포함하는 모든 파일에는 변수의 "외부"만 주어지며, 변수에 공간을 할당한다.

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 */

내가 아는 유일한 단점은 동일 파일에 두 번 포함해도 포함 가드가 당신을 구하지 않는다는 것이다.

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

반응형