gcc arm에서 혹시 /##/ => //로 해주는 것 아시는 분 있나요
C에서 ##을 이용해서 문자열을 합치는 define문을 정의해서 컴파일하는데
gcc컴파일시 token오류가 발생하네요... (참고:비쥬얼스튜디오 2003에서는 됨)
//////////////////////////////////////////
1. 개발중
//////////////////////////////////////////
//해더파일에 선언.h
#define DEBUG_N printf //개발중에
//#define DEBUG_N /##/ //개발완료후
...
//파일내부.c
DEBUG_N("디버그중\n");
...
=> 이와 같이 #define의 이용해서 함수를 바꿔서 간단하게 코딩후에
개발이 완료된후에는 위의 소스에서
//////////////////////////////////////////
2. 개발완료
//////////////////////////////////////////
//해더파일에 선언.h
//#define DEBUG_N printf //개발중에
#define DEBUG_N /##/ //개발완료후
...
//파일내부.c
DEBUG_N("디버그중\n");
...
=> [의도]
위의 DEBUG_N => //("디버그중\n");으로 변경되어서 주석처리로됨
=> 이와같이 의도가 비쥬얼스튜디오에서는 잘되는데
=> gcc로 컴파일 하면 아래와 같은 오류가 발생합니다.
src/SpriteManager.c: In function `drawSprite':
src/SpriteManager.c:221: parse error before '/' token
어떻게 다른 방법이 없을까요?
_
주석은 전처리기 작업 이전에 모두 사라집니다. VC++가 비표준적인 방식으로 동작하는 것입니다.
그리고 매크로를 좀 위험한 방식으로 처리하는 것 같은데(개인적인 의견이지만 함수에 매크로를 할 때에는 되도록 매크로 함수를 쓰는 게 좋다고 생각해요), 이렇게 하는 게 어떨까요.
#ifdef DEBUG
#define DEBUG_N(...) printf(__VA_ARGS__)
#else
#define DEBUG_N(...)
#endif
C99에서는 매크로 함수에서도 가변 인수를 지원합니다. 사용할 때 주의할 점이 있기는 하지만요. (__VA_ARGS__가 빈 값일 경우 func(a, b, __VA_ARGS__)가 func(a, b, )로 처리되어 컴파일 오류가 납니다)
어쨌거나 C99를 지원하는 컴파일러라면 지원합니다. GCC는 지원하겠는데 VC++는 잘 모르겠네요 --;;
if( something )
위와같을 때 오동작을 할 수 있습니다.
#define DEBUG_N(...) do{}while(0)
등으로 뭘 넣어주는게 좋을 듯 합니다.
_
네.. 실은 그걸 빼먹었었는데 고친다 해놓고 잊어버렸네요 --;;
저는 #define DEBUG_N(...) {}과 같이 쓰는 방식을 좋아해요. 뒤에 세미콜론을 붙일 수 있는 매크로 중에서는 {}가 짧은 편이니까요.
$ cat > foo.c #define
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
$ cat > foo.c #define
http://www.google.com/search?complete=1&hl=ko&q=C+null+statement&lr=&aq=f
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
어디선가 본 구절인데...
"모든 소스는 C-Language 한 권을 읽어 본 남녀노소 누구나 읽을수 있어야 한다."
## 은 ML 만의 전처리입니다. ~
표준을 되도록 안지키면 나중에 자잘한 것도 포팅이슈가 되는 것같습니다.
Hello World.
_
전처리기의 ##는 C/C++ 표준이 맞습니다. 적어도 C99와 C++98 표준에는 ##가 있습니다.
CL vs GCC
CL 과 GCC 차이가 있습니다.
C:\> CL test.c
C:\> test.exe
HELLO WORLD
helloworld
$> gcc -std=c99 test.c
test.c: In function ‘main’:
test.c:8: warning: initialization makes integer from pointer without a cast
test.c:10: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
test.c:11:1: error: pasting ""hello"" and ""world"" does not give a valid preprocessing token
Hello World.
_
문자열에 대한 ## 동작은 VC++ 확장으로 보입니다. "hello" ## "world"의 결과로 helloworld가 나온다면 그것도 이상하고, "helloworld"가 필요하면 그냥 "hello" "world"로 쓰면 되고요.
C 프로그래밍 언어는
C 프로그래밍 언어는 전처리기와 문법, 의미론, 표준 라이브러리를 모두 포함하는 광범위한 표준입니다.
댓글 달기