2013-08-30 2 views
1

매크로 매개 변수를 기반으로 함수 및 변수를 생성하는 전 처리기 매크로가 있습니다. 매크로가 헤더 파일에 정의되어있는 매크로가전처리 기 : 동적 이름으로 함수를 생성하십시오. 다중 정의 문제

Inst* AActivate() { ... } 
bool Atemp; 

Inst* BActivate() { ... } 
bool Btemp; 

같은 것을 생성하는 것입니다 B A와 매크로 sequently를 호출

은 내가 링커 오류가 이미 정의 된 심볼에 대해 저를 알리는 얻을. #pragma를 한 번 사용하고 있지만 헤더 내에 함수를 구현할 때 문제가 있다고 생각합니다.

여기에 매크로의 :

#define REGISTER(ns, id, type) \ 
     Inst* type##Activate() { return new type(); }\ 
     bool type##temp = RegisterType(ns << 8 | id, &type##Activate); 

가 지금은 그런 문제를 처리하는 방법을 궁금해. 첫 번째 아이디어는 #define-Guards를 사용하는 것이었지만 분명히 C++에서는 불가능한 중첩 된 #define이 필요했습니다. 나는 boost와 함께 가능한 해결책에 대해 읽었지만 unfortunaetly, 나는이 라이브러리들을 사용할 수 없다.

아이디어가 있으십니까?

답변

3

매크로는 헤더 기능 정의를 생성 ... 사전에 감사하고, 헤더가 하나 이상의 번역에 포함됩니다 경우 어떤 정상적인 기능과 같은 헤더가 아닌 인라인 함수는 ODR을 위반 단위. 그래서 생성 된 함수를 인라인으로 만듭니다.

ODR이 전역 varibales에 대해서도 마찬가지로 적용됩니다. 내부 연결을 얻으려면 static 또는 const로 선언해야합니다. 그러면 변수의 독립적 인 인스턴스가 여러 개 제공됩니다. 각 인스턴스는 헤더가 포함 된 각 번역 단위에 대해 하나씩 제공됩니다. 어쨌든 전역 변수는 나쁜 스타일로 간주되므로 다른 것을 생각해야합니다.

+0

같은

C에서이 보일 것입니다 뭔가 그가 나에게 유선있다 ... 나는 이미 #DEFINE 매크로 내에서 * 활성화-기능 인라인을 정의하기 위해 시도했지만 놀랍게도 여러 정의 오류가 계속 발생 해 주셔서 감사합니다 – mbue

+0

Ah nevermind, stupid me ... 나는 VS 내에서 잘못된 프로젝트 파일을 컴파일했다. 인라인을 사용하면 물론 작동합니다. 고맙습니다 – mbue

0

.cpp 파일에서 매크로를 사용하거나 함수를 인라인하십시오. # pragma를 사용하면 .cpp 파일에 헤더가 두 번 이상 포함되지 않으므로 실제로는 #pragma를 한 번 사용하면 도움이되지 않습니다. 여러 .cpp 파일을 컴파일 할 때 함수는 여러 번 정의됩니다.

0

C와 C++ 모두에 태그를 지정했으면 실제로 어느 것을 사용해야하는지 결정해야합니다.

함수 정의가 inline 인 경우에만 두 언어로만 작동합니다. 그런 다음 두 개의 매크로가 있어야합니다. 한 매크로는 함수를 보려는 모든 헤더 파일에서 호출 할 인라인 정의 용입니다.

또한 "인스턴스화"를 수행하기 위해 .c 또는 .cpp 파일로만 호출되는 두 번째 매크로가 있어야합니다. 여기서 구문은 C 또는 C++에서 약간 다를 수 있습니다.

#define REGISTER(ns, id, type)           \ 
     inline Inst* type##Activate() { return new type(); }     \ 
     extern bool type##temp 

    #define INSTANTIATE(ns, id, type)          \ 
     Inst* type##Activate();            \ 
     bool type##temp = RegisterType(ns << 8 | id, &type##Activate) 
관련 문제