- 안영기의 개발실 - (Tizen / WIZ / CAANOO / bada): trigraph 태그 글 목록http://smgal.ismine.net/tc_191/blog1/Tizen과 GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자2014-10-31T05:46:54+09:00Textcube 1.9.1C의 변방에 있는 문법안영기http://smgal.ismine.net/tc_191/blog1/12009-01-09T09:13:52+09:002009-01-09T09:13:44+09:00<div>다음의 코드를 VC++에 넣고 돌려보면 아무런 문제가 없이 빌드된다.</div><div>두 번째의 int a 에서 중복 선언 에러가 날 법한데도 말이다.</div><div><br></div><div><div style="padding:10px; background-color:#E4E4E4"><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">int main()</span></span></div><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">{</span></span></div><div><span class="Apple-tab-span" style="white-space:pre"><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"> </span></span></span><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">int a = 100;</span></span></div><div><span class="Apple-tab-span" style="white-space:pre"><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"> </span></span></span><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">// 'a' : redefinition ???????????/</span></span></div><div><span class="Apple-tab-span" style="white-space:pre"><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"> </span></span></span><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><strong><span style="color: rgb(255, 51, 153);">int a = 0;</span></strong></span></span></div><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><br></span></span></div><div><span class="Apple-tab-span" style="white-space:pre"><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"> </span></span></span><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">return a;</span></span></div><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;">}</span></span></div></div></div><div><br></div><div>왜일까... 그래서 gcc에서 돌려 보면 </div><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><span style="color: rgb(23, 127, 205);">warning: trigraph ??/ ignored, use -trigraphs to enable</span></span></span></div><div>라는 경고를 준 후 정상적으로 에러를 낸다.</div><div><br></div><div>혹시나 해서 위의 경고 대로</div><div><span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><span style="color: rgb(23, 127, 205);">gcc a.c -trigraphs</span></span></span></div><div>이렇게 컴파일을 하면 VC++에서처럼 문제없이 빌드가 된다.</div><div><br></div><div>이렇게 되는 이유는 C 언어의 trigraph라는 문법 때문이다. 원래는 C 언어에서 사용하는 모든 캐릭터에 대해, 모든 키보드가 그 키를 가지고 있는 것이 아니었기 때문에 만들어진 것인데 물음표 2개 뒤에 특정한 캐릭터를 더 붙이면 그것이 1개의 다른 캐릭터로 치환되는 것이다. 위의 <span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><span style="color: rgb(23, 127, 205);">'??/'</span></span></span>는 <span style="font-family: 'Courier New', courier, monospace;"><span style="font-size: small;"><span style="color: rgb(23, 127, 205);">'\'</span></span></span>로 치환이 된다.</div><div><br></div><div>공교롭게도 '?' 와 '/' 는 같은 키이다. '?'를 연속으로 출력하고자 하다가 실수로 shift 키를 먼저 떼는 실수를 했다면 저렇게 '??/'라는 문자열로 끝날 때가 종종 있다. 이렇게 되면 이것은 마지막이 '\'로 해석이 되니 다음 줄은 주석과 같은 줄로 취급하게 되어 그 줄도 주석이 된다.</div><div><br></div><div>이런 실수를 하게 되었을 때 이 문법 자체를 모른다면 해결하기가 쉽지는 않을 것이다.</div><p><strong><a href="http://smgal.ismine.net/tc_191/blog1/1?commentInput=true#entry1WriteComment">댓글 쓰기</a></strong></p>