C 언어의 X 매크로

때때로 우리가 프로그램에서 오류 코드를 정의할 때, 항상 그에 대응하는 오류 정보를 얻는 함수가 있다.예를 들면 다음과 같습니다.
enum ErrorCode
{
    ERROR_0,
    ERROR_1,
    ERROR_2,
    ERROR_3
};

const char* get_error_info(enum ErrorCode error_code)
{
    switch(error_code)
    {
    case ERROR_0:
        return "error info 0";
    case ERROR_1:
        return "error info 1";
    case ERROR_2:
        return "error info 2";
    case ERROR_3:
        return "error info 3";
    }

    return "";
}

또 다른 방법은 다음과 같다.
enum
{
    ERROR_0,
    ERROR_1,
    ERROR_2,
    ERROR_3
};

const char* error_info[] =
{
    "error info 0",
    "error info 1",
    "error info 2",
    "error info 3"
};

하지만 이런 식으로 ERROR가 추가되면4 후엔 error에서info에 응답 내용을 추가하면 그룹 하위 표시가 경계를 넘어갑니다!
그래서 누군가가 X매크로를 만들었는데 이것은 C 언어 자체의 예처리 메커니즘을 이용했다
test.h
#ifndef _TEST_H_
#define _TEST_H_

#define NUMBER      X(One,"One") X(Two,"Two") X(Three,"Three")

#define X(a,b)      a,

enum Number { NUMBER };

#undef X

extern const char *NumberStrings[];

#endif // _TEST_H_

test.c
#include "test.h"

#define X(a, b) b,

const char *NumberStrings[] =  {NUMBER};

#undef X

위 방법을 사용하면 헤더 파일에서 NUMBER 매크로의 매거진과 관련 내용의 정의를 확장할 수 있습니다.
이 기교는 매거와 문자열의 관련에 국한되지 않고 매거와 어떤 유형의 관련 내용에도 국한될 수 있다.
참조 자료:http://weibo.com/p/1001603878433896971283

좋은 웹페이지 즐겨찾기