다음의 코드를 VC++에 넣고 돌려보면 아무런 문제가 없이 빌드된다.
두 번째의 int a 에서 중복 선언 에러가 날 법한데도 말이다.
int main()
{
int a = 100;
// 'a' : redefinition ???????????/
int a = 0;
return a;
}
왜일까... 그래서 gcc에서 돌려 보면
warning: trigraph ??/ ignored, use -trigraphs to enable
라는 경고를 준 후 정상적으로 에러를 낸다.
혹시나 해서 위의 경고 대로
gcc a.c -trigraphs
이렇게 컴파일을 하면 VC++에서처럼 문제없이 빌드가 된다.
이렇게 되는 이유는 C 언어의 trigraph라는 문법 때문이다. 원래는 C 언어에서 사용하는 모든 캐릭터에 대해, 모든 키보드가 그 키를 가지고 있는 것이 아니었기 때문에 만들어진 것인데 물음표 2개 뒤에 특정한 캐릭터를 더 붙이면 그것이 1개의 다른 캐릭터로 치환되는 것이다. 위의 '??/'는 '\'로 치환이 된다.
공교롭게도 '?' 와 '/' 는 같은 키이다. '?'를 연속으로 출력하고자 하다가 실수로 shift 키를 먼저 떼는 실수를 했다면 저렇게 '??/'라는 문자열로 끝날 때가 종종 있다. 이렇게 되면 이것은 마지막이 '\'로 해석이 되니 다음 줄은 주석과 같은 줄로 취급하게 되어 그 줄도 주석이 된다.
이런 실수를 하게 되었을 때 이 문법 자체를 모른다면 해결하기가 쉽지는 않을 것이다.
Posted by 안영기