C의 extern 키워드
이 기사는 C에서extern
키워드를 사용하는 방법에 대한 여러 방법을 보여줍니다.
extern
키워드를 사용하여 C의 다른 파일에 정의 된 변수 선언
일반적으로 C 언어 변수에는 외부 연결, 내부 연결 또는 연결 없음의 세 가지 연결 유형이 있습니다. 변수가 블록 또는 함수 범위에 정의 된 경우 연결이없는 것으로 간주됩니다. 파일 범위가있는 변수는 내부 또는 외부 연결을 가질 수 있습니다. 즉, static
한정자로 전역 변수를 선언하면 내부 연결이되어 단일 소스 파일 (보다 정확하게 번역 단위)에서 변수를 사용할 수 있음을 의미합니다. static
한정자가없는 전역 변수는 외부 연결이있는 것으로 간주되며 다른 소스 파일에서 사용할 수 있습니다. 다른 소스 파일에 정의 된 전역 변수를 사용하려면extern
키워드를 사용하여 선언해야합니다.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
exit(EXIT_SUCCESS);
}
출력:
counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
extern
한정 변수는 일반적으로 다른 파일의 어딘가에 정의됩니다. 그러나 기술적으로는 다음 예제와 같이extern
키워드를 사용하여 동일한 파일에서 전역 변수를 선언 할 수 있습니다. 이러한 유형의 선언은 컴파일러가 자동으로 동일한 파일 범위의 모든 위치에 변수 이름을 표시하기 때문에 본질적으로 중복됩니다.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
int counter2 = 0;
int main(void) {
extern int counter2; // redundant
counter2 += 10;
printf("%d\n", counter2);
exit(EXIT_SUCCESS);
}
하지만extern
선언 된 변수는 하나의 소스 파일에const char *
전역 변수를 정의하고 일부 문자열 리터럴 값으로 초기화하면 컴파일러 경고가 발생하므로 초기화해서는 안됩니다. 다른 소스 파일에서const
한정자없이 동일한 변수를 선언하면 경고없이 컴파일되고 객체의 상수가 제거됩니다. 따라서 사용자가 읽기 전용 문자열 tmp
를 수정하려고하면 컴파일러에서 오류가 발생하지 않지만 프로그램은 분할 오류를 발생시킵니다.
#include <stdio.h>
#include <stdlib.h>
#ifndef COUNT
#define COUNT 10
#endif
extern int counter;
// extern int counter = 3; // erroreous
extern char *tmp; // erroreous
int counter2 = 0;
int main(void) {
printf("counter: ");
for (int i = 0; i < COUNT; ++i) {
counter += 1;
printf("%d, ", counter);
}
printf("\b\b \n");
tmp[0] = 'S'; // segmentation fault
printf("%s", tmp);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook