헤더 파일의 변수 선언
여러 출처에서 사용할 수 있는 변수가 있는 경우, 헤더로 선언하는 것이 좋은 관행인가?아니면 에 신고하는 것이 더 나은가?.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
'programing' 카테고리의 다른 글
C의 기본 매개 변수 (0) | 2022.05.07 |
---|---|
Vue.js의 ''에 있는 텍스트를 참조하는 방법 (0) | 2022.05.07 |
Vuex 스토어 값을 입력하지 않고 업데이트 (0) | 2022.05.07 |
타이페프의 용도는 무엇인가? (0) | 2022.05.07 |
소수점 자리 n개로 부동 소수점 형식 지정 (0) | 2022.05.06 |