C전처리기가 linux를 상수 1로 처리했습니다. 왜 그런 거죠?
조회수 2262회
발생하는 문제 및 실행환경
GCC에 C 전처리기가 변수 이름 linux를 상수 1으로 처리해버렸습니다.
소스코드
//test.c:
#include <stdio.h>
int main(void)
{
int linux = 5;
return 0;
}
이걸 gcc -E test.c
로 전처리된 결과를 보니
int main(void)
{
int 1 = 5;
return 0;
}
이렇게 처리되고, 실행하면 에러가 발생했습니다. linux가 에 정의된 것 같진 않던데 왜 그런거죠?
1 답변
-
아주 옛날 ANSI가 있기 전엔,
unix
나vax
같은 미리 정의된 심볼들을 "이 프로그램이 어떤 시스템에서 컴파일되고 있는지"를 지정해주는 역할로 썼던 적이 있었습니다. 이때는 표준이 정해지기 전이기 때문에, 시스템에 많이 영향을 받았었지요.보통 이런 매크로들은 라이브러리 헤더가 아니라 컴파일러가 설정했었 표준이 없어서 어떤 식별자가 구현되는지, 어떤 예약어가 있는지 정해진 게 없었기 때문에, 컴파일러를 만드는 사람들은 프로그래머가 어련히 알아서 안쓰겠지..같은 마음가짐으로
unix
같은 이름을 자기 마음대로 만들었었습니다.그 뒤로 1989년, ANSI C 표준안이 만들어졌고 그 이후로는 심볼 등을 마음대로 만드는 걸 제한해 프로그래머와 컴파일러가 쓰는 이름이 겹치지 않게 됩니다. 예를 들어 표준 라이브러리를 보면 매크로 이름을 언더바(_) 2개로 시작하거나, 언더바 다음에 대문자가 오는 식으로 만들어놨습니다.
그래서 표준을 따르지 않고
unix
나linux
등을 정의해 놓은 컴파일러에서는 표준을 따르는 프로그래머들이 생각하기엔 정상적인 코드(int linux = 5
같은)를 컴파일할 수 없습니다.gcc의 기본 설정은 '표준을 따르지 않음'으로 되어 있기 때문에 옵션을 별도로 줘야 합니다.
gcc -std=c90 -pedantic ... #-std=c89나 -ansi로 해도 됨 gcc -std=c99 -pedantic gcc -std=c11 -pedantic
댓글 입력