프로그램 사용/gcc2010.01.27 17:18
#if 문이라던가 각종 전처리기용 문구들은
여러가지 확장을 통해서 컴파일을 하기 때문에 source insight 등의 힘을 빌려도 분석하기 어려운 면이 있다.

일반적으로 컴파일러는 전처리기 - 컴파일 - 어셈블 - 링크 과정을 거치는데(아마도?)
전처리기 까지만 거친 결과를 stdout 으로 출력해준다.

$ man gcc
       -E  Stop after the preprocessing stage; do not run the compiler proper.
            The output is in the form of preprocessed source code, which is sent to the standard output.

           Input files which don't require preprocessing are ignored.

[링크 : http://linux.die.net/man/1/gcc]

$ cat test.c
#if 1
int test;
#else
int tt;
#endif

int main()
{
        return 0;
}

$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"

int test;




int main()
{
 return 0;
}


#include 하는 모든 파일을 확장하기 때문에, #include <stdio.h>만 해도 내용이 엄청 길어진다.
그리고 줄단위로 처리하기 때문에 사라진 #if 문 대신 엔터만 남아 위와 같이 휑~하게 나왔다.


[링크 : http://cafe.naver.com/devctrl/949]
신고
Posted by 구차니

댓글을 달아 주세요

Before


void main()
{
int test = 13;
printf("\ntest [%ld:0x%lX]",test,test);
}

After
#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
void main()
{
int test = 13;
debug_print(test);
}

#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
전처리기에서 #name은 name의 내용을 문자열로 치환해주는 역활을 한다.

다른 용법은 아래 참고, ## 라는 용법도 있는데 두개를 하나로 붙여 준다.
[참고 : http://cafe.naver.com/devctrl/1921]
신고
Posted by 구차니

댓글을 달아 주세요