C의 extern 키워드

Jinku Hu 2023년10월12일
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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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