-
[Keyword] extern , staticSoftware/C 2024. 8. 20. 10:48728x90
개요
C#이나 자바는 객체지향이 특징으로 클래스로 캡슐화된 여러 cs파일들을 통해 서로 함수와 변수를 주고받는다. 하지만 C언어의 경우에는 클래스라는 개념이 없는데, 대신 조금 더 다운 레벨 수준에서 비슷한 역할을 하며 서로 함수와 변수를 주고받는 기능이 있다. extern과 static 키워드이다.
extern 키워드
C는 기본적으로 함수 외부에 선언되는 모든 변수가 전역변수로 선언된다. 또한 모든 함수들은 기본적으로 전역이다.
다음을 살펴보자.
practice1.c 파일에서 선언된 a,b는 전역변수이다. 이 전역변수를 다른 c파일인 main.c에서 가져다 쓰려면 외부에서 참조한 변수라는 의미의 키워드인 extern을 앞에 붙여 사용하면 컴파일러가 해당 변수는 다른 c파일에 있는 변수구나 하고 해당 변수를 가지고 있는 parctice1.c로 가서 해당 변수를 참조하게 된다.
만약 extern 키워드를 안붙이고 사용하면 어떻게 될까?
C는 C++처럼 strong type checking언어가 아니기 때문에 컴파일러가 컴파일 과정에서 타입유추를 한다. 타입 유츄는 어느 한쪽의 전역변수가 extern이 생략된 것으로 보고 컴파일을 진행하는 것이다. 따라서 컴파일 과정에서 별 문제가 없이 넘어갈 수 있지만 만약 양 쪽의 변수 모두 초기화를 하여 선언하였다면 컴파일러가 extern이 생략되지 않은 온전한 두 개의 전역변수로 인식하고 이름 중복으로 컴파일 에러를 띄운다. 같은 네임스페이스에 같은 이름의 변수는 존재할 수 없기 때문이다. 따라서 어지간하면 C언어를 사용할 때도 C++처럼 extern 키워드를 꼭 사용하여 코드를 구성하는 것이 추후 발생할 수 있는 에러 예방을 위해 좋다. C++은 이런 경우 extern 키워드를 붙이지 않으면 컴파일러에서 에러를 바로 띄워버린다.
함수의 경우는 어떨까??
함수의 경우는 약간 다르다. c에서 모든 함수는 기본적으로 전역이고, 정의된 함수를 다른 파일에서 선언할때는 기본적으로 extern이 생략된 형태로 불러오기 때문이다.
다음을 보자. main.c에서 선언한 num함수는 선언부만 있고 정의가 없기 때문에 자동적으로 extern으로 컴파일러가 타입 유추를 하고, 외부에 있는 num함수를 참조하러 떠난다. 그리고 parctice.c에서 같은 함수의 정의 부를 발견하고 이거다 하고 실행하게 되는것이다.
이 때도 만약 main.c파일에서 num함수의 정의를 가지고 있다면, 컴파일러는 정의 중복으로 컴파일 에러를 띄울 것이다. 하나의 함수가 extern키워드라고 유추할 수 없기 때문이다. 만약 같은 이름의 함수를 재정의하여 사용하고 싶다면 재정의 하는 파일에서 static 키워드를 사용하여 함수를 정의하면 된다.
static 키워드
static은 C에서 변수를 함수 밖에서도 유지시키는 역할을 하는 키워드임과 동시에, 함수나 변수의 범위를 해당 파일 안으로만 설정하는 키워드이기도 하다.
static 키워드가 앞에 붙은 변수나 함수는 해당 파일에서만 접근이 가능하다. 만약 static 키워드가 붙은 전역변수나 함수를 외부 파일에서 extern을 붙여 접근하려고하면 컴파일 에러가 발생하게된다.
정적 신뢰성 소프트웨어 테스트 룰인 MISRA-C에서는 파일에서 전역변수가 해당 파일에서만 사용되는 것일 경우 무조건 static을 붙여야한다는 룰이 존재한다. 외부에서 접근하여 발생할 수 있는 오류를 원천적으로 차단하는 방식으로 코딩을 진행하는 것이다. 따라서 신뢰성 테스트를 필연적으로 해야하는 코딩을 할 때를 염두에 두어 꼭 static과 extern을 붙이는 습관을 들여야 할 것이다.
728x90'Software > C' 카테고리의 다른 글
[MISRA C 2012] 정적 분석 팁 ( 계속 업데이트 ) (0) 2024.08.29 [Keyword] __interrupt (0) 2024.08.21 전처리기 #if , #ifndef , #define, #endif (0) 2024.08.20