반응형

혹시, 전처리 연산자 #을 아십니까? C언어 개발자 중에서 #이 별도의 연산자라는 것을 모르는 분이 너무 많습니다. 
#은 #include, #if, #define에 앞에 붙여서 전처리기임을 표시하는 데 사용하는 것 아냐? 라고 얘기를 합니다. 그러면 ## 연산자는 알고 있나요? ##은 또 뭐야? 머리가 더 아픕니다.


#과 ## 연산자는 주로 #define으로 매크로 함수나 매크로 정의 시에 많이 사용합니다.

 

#연산자

#연산자는 문자열로 변환하는 연산자입니다.

 

Example 1. 정수형 데이터를 출력시 자동으로 변수명과 값을 출력하는 예제

#define PRINT_INT(a) printf("%s: %d\n", #a, a)

사용예)
    int count = 100;
    PRINT_INT(count);


결과:
    count: 100    <-- count라는 변수가 문자열로 출력되었습니다.

이해가 되시나요?

 

위의 경우 #연산자를 모르면

printf("%s: %d\n", "count", count);

라고 해야겠지만, #연산자로 변수명을 자동으로 문자열화 할 수 있습니다.

 

Example 2.

#define _CALL_TRACE(func)   \
    printf("%s is started...\n", #func);   \
    func;  \
    printf("%s is finished.\n", #func)

사용예)
    _CALL_TRACE(ret = file_create(filename));

결과:
    ret = file_create(filename) is started....
    //이부분은 file_create(filename)이 로그를 찍어서 출력되는 부분
    ret = file_create(filename) is finished...

위의 모양을 file_create() is started... 로 찍고 싶을 때에는 문자열을 넣으면 함수명을 return해주는 함수를 하나 만들어서 사용하면 됩니다.
char *func_name(const char *func_call); 이 함수가 func_name() 형태의 문자열을 return 한다면.

 

Example 3.

#define _CALL_TRACE(func) \
    printf("%s is started...\n", func_name(#func)); \
    func;\
    printf("%s is finished.\n", func_name(#func))


사용예)
        _CALL_TRACE(ret = file_create(filename));


결과:
    file_create() is started....
    //이부분은 file_create(filename)이 로그를 찍어서 출력되는 부분
    file_create() is finished...

위와 같이 TRACE 로그를 한방에 해결할 수 있습니다.

 

 

## 연산자

##연산자는 이름 연결 연산자입니다. 참 설명하기 힘드네요. 예를들어 설명하겠습니다.

#define _DEFINE_GETSET(type, var_name)  \
    type get##var_name(void)  \
    {  \
        return var_name; \
    } \
    void set##var_name(type _##var_name) \
    { \
        var_name = _##var_name;
    }

사용 예).
    _DEFINE_GETSET(int, Age)
    // 세미콜론 안붙임.


결과:
    int getAge(void)
    {
       return Age;
    }
    void setAge(int _Age)
    {
       Age = _Age;
    }

를 코딩한 것 과 같습니다.

 

#, ## 연산자는 주로 솔루션이나 개발툴을 개발하는 경우에 종종 사용 합니다.
Visual C++의 MFC 라이브러리에서 상속관계를 문자열로 표시하거나 class에 따른 변수명을 자동으로 만들기 등 많이 사용합니다.

 

defined 연산자

defined 연산자는 #define이나 Compiler에서 설정한 default 매크로, -D 컴파일 옵션을 통한 매크로 정의 여부를 검사하는 연산자입니다.


#if defined(_DEBUG)
는 #ifdef _DEBUG와 같은 의미입니다.

#if !defined(_DEBUG)
는 #ifndef _DEBUG와 같은 의미입니다.

 

그러면, #ifdef 나 #ifndef가 있는 데, 굳이 define 연산자는 왜 만들었을까요? 그것은 defined 연산자를 이용하면 두가지 이상의 조건을 논리 연산을 통하여 사용할 수 있습니다.

#if defined(_DEBUG) && defined(_WINDOWS)
...
#endif
처럼 사용할 수 있습니다.

 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,