문제

처음에 나는 이것을 필요로한다고 생각했지만 결국 그것을 피했습니다. 그러나 나의 호기심 (그리고 지식에 대한 식욕, 윙윙 거리는 소리)은 다음과 같이 물어 보게됩니다.

예를 들어 전처리 매크로를 할 수 있습니다

#include "MyClass.h"

INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)

IN과 같이 다른 포함로 확장하십시오

#include "MyClass.h"

#include "FooTemplate.h"
template class FooTemplate<MyClass>;

?

도움이 되었습니까?

해결책

나는 그것을 할 수 없다고 생각합니다. 이것은 사전 프로세서가 단일 패스. 따라서 다른 사전 처리기 지침을 방출 할 수 없습니다.

특히 C99 표준 (6.10.3.4 단락 3)에서 :

3 생성 된 완전히 거시적 인 사전 프로세싱 토큰 시퀀스는 유사하더라도 전처리 지침으로 처리되지 않습니다.

흥미롭게도, 이것이 단지입니다 _Pragma 운영자는 C99에 추가되었습니다. 왜냐하면 #pragma 매크로에 의해 방출 될 수는 없지만 _Pragma 할 수 있다.

다른 팁

C 표준은 전처리 지침 (C99-6.10 (2) - 전처리 지침)에 대해 다음과 같이 말합니다.

전처리 지시문은 (번역 단계 4의 시작 부분에서) # 전처리 토큰으로 시작하는 일련의 사전 처리 토큰으로 구성됩니다.

및 (C99-6.10 (7)) :

전처리 지침 내의 사전 처리 토큰은 달리 명시되지 않는 한 거시적 확장의 대상이되지 않습니다.

예제 :

#define EMPTY
EMPTY # include <file.h>

두 번째 라인의 전처리 토큰 순서는 매크로 빈이 교체 된 후에도 번역 단계 시작시 #부터 시작하지 않기 때문에 전처리 지침이 아닙니다.

따라서, 매크로는 ''로 확장 할 수 없습니다.#include'전처리 지침. 해당 지침은 번역 4 단계 시작시 (해당 지시문을 처리 할 때 전처리가 발생할 때) 지시 사항을 제정해야합니다. 4 상 동안 매크로 확장이 발생하기 때문에 매크로는 4 단계 시작시 무언가가 존재할 수 없습니다.

그러나 지적하고 싶습니다. 다음은 하다 일하다:

#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"

#include PLATFORM_HEADER

C 표준이 이것을 말하기 때문에 (C99, 6.10.2 (4) - 소스 파일 포함) :

양식의 전처리 지침

# include pp-tokens new-line

(이전 두 형식 중 하나와 일치하지 않음)가 허용됩니다. 지침에 포함 된 후 전처리 토큰은 정상 텍스트와 같이 처리됩니다. (현재 매크로 이름으로 정의 된 각 식별자는 사전 처리 토큰의 교체 목록으로 대체됩니다.)

모든 사전 처리기 지시문은 매크로 확장이 시작되기 전에 해석되므로 아니요. 매크로를 #include 지시문으로 확장 할 수 없으며 해석 될 수 없습니다. 대신 (잘못된) C ++ 코드로 해석됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top