2012-06-22 2 views
1

나는 전에 C에서 템플릿 을 구현하는 다음과 같은 방법을 본 적이 없다고 생각합니다. 내 생각은 templating-work에 Preprocessor를 만드는 것이 었습니다.C에서 전처리기를 사용하여 템플릿을 작성

container.h :

#ifndef TEMPLATE_TYPE 
    #error "missing decalaration TEMPLATE_TYPE" 
#endif 

#define _CONCAT(a, b) a##b 
#define _EVALUATOR(a, b) _CONCAT(a, b) 
#define MAKE_NAME(a, b) _EVALUATOR(a, b) 

typedef struct { 
    TEMPLATE_TYPE data; 
} MAKE_NAME(Container_, TEMPLATE_TYPE); 

main.c를 :

#define TEMPLATE_TYPE int 
#include "container.h" 

int main() { 
    Container_int c; 
    c.data = 99923; 
} 

그래서, 사건은 무엇입니까?

  1. 이 단지 생각된다 "나쁜 스타일"그것은 아무도는
  2. 기사 많이 있습니다, 단지 사람이 구글에 대한 기사를 쓸 것이 너무 명백
  3. !

을 # 3으로 대답하지 않으려는 경우이 기술에 대한 의견을 보내 주시면 감사하겠습니다.

+0

전에 이런 일은 본 적이 없습니까? – Dave

+0

구문 설탕은 세미콜론의 암을 유발합니다 ... –

+0

이 질문은 [http://codereview.stackexchange.com/](http://codereview.stackexchange.com/)에 속한 것 같습니다. –

답변

4

전 처리기로 놀라운 것을 할 수 있습니다. 나쁜 스타일로 간주되는지 여부는 판단 호출이며, 결과적으로 발생하는 코드의 품질, 가독성 및 유지 관리 가능성에 크게 좌우됩니다. 복잡한 전 처리기 매크로는 작성, 디버그 및 유지 관리의 어려움이 있습니다. 그러나 가장 좋은 C 코드는 이 아니고 코드가이고 매크로는 테마의 변형을 자동으로 생성하는 데 유용합니다. 여기

전 처리기의 좋은 예이다 (AB)를 사용

SimpleScalar 코드는 위의 제안과 같은 패턴을 사용합니다. 여기서 #include 앞에는 헤더에 방향을 지정하는 #define이옵니다.

전 처리기를 심각하게 사용하려는 경우 Boost preprocessor library을 확인해야합니다.

typedef struct { 
    TEMPLATE_TYPE data; 
} MAKE_NAME(Container_, TEMPLATE_TYPE) 

3

대신 (처리기 매크로 C.와 함께 잘 작동 ++ 뿌리 부스트의 C에 의해 연기하지 말라) 당신은 일하기 위해

#define MAKE_CONTAINER(type) typedef struct MAKE_NAME(Container_, type) { type data; } MAKE_NAME(Container_, type) 

작업을 수행 할 수 있습니다 할 수있다

#include "container.h" 
MAKE_CONTAINER(int); 
MAKE_CONTAINER(double); 

int main() { 
    Container_int c; // one way to go 
    struct Container_double d; // my preferred way: don't typedef when not needed; let the structs be obvious. 

    c.data = 99923; 
    d.data = 3.5; 
} 
관련 문제