반응형

C : extern 키워드

작성계기

실제로 실수를 했었고, 찾아보니 의외로 다른사람도 잦은 실수를 하는 것 같아서 작성함.


키워드의 의미

다른 파일에 있는 변수를 현재 파일에서 사용하기 위해서 사용하는 키워드이다. 원리상 다른 파일 어딘가(메모리의 어딘가)에 해당변수가 있으니 그걸 참조하라는 의미가 된다.


예시)

a.c (변수가 정의 되어 있는 파일)

int a = 0;


b.c (a.c 파일에 있는 변수를 호출해서 사용하는 파일)

extern int a;
a = 20;


활용 및 응용

매번 새로운 파일에서 참조를 할 때마다 앞단에 extern 키워드로 사용가능하게 하는 것은 상당히 번거롭기 때문에 해당되는 헤더파일에 작성하여 여러번 작성을 하지 않게 할 수 있다.


예시)

a.c (변수가 정의 되어 있는 파일)

#include "a.h"
int a = 0;


a.h (변수가 정의 되어 있는 파일의 헤더파일)

#pragma once
extern int a;


b.c (a.c 파일에 있는 변수를 사용하는 파일)

#include "a.h"
a = 20;


당연한 말이지만, 해당 선언을 중복으로 선언하게 되면, 오류가 된다. 따라서 #pragma once 혹은 #ifndef를 활용하여 중복선언을 피하도록 하자.


실수하는 예

C의 전형적인 함정은 주로 배열에서 발생된다. 배열로 선언/정의 한것과 포인터로 선언/정의 된것은 다른 것으로 컴파일러가 구분한다. 의미상 배열선언의 키워드도 포인터로 같은 종류로 (사람은) 인식하지만, 컴파일러는 다른 것으로 인식을 한다.


예시)

a.c (정의된 원본 파일)

char a[] = "abc";


b1.c (오류/에러로 인식 "그런거 없다고 한다")

extern *a;
char b = a[0];


b2.c (정상 호출)

extern a[];
char b = a[0];



반응형

+ Recent posts