다른 사전 처리기 지침으로의 사전 처리기 매크로 확장
-
12-09-2019 - |
문제
처음에 나는 이것을 필요로한다고 생각했지만 결국 그것을 피했습니다. 그러나 나의 호기심 (그리고 지식에 대한 식욕, 윙윙 거리는 소리)은 다음과 같이 물어 보게됩니다.
예를 들어 전처리 매크로를 할 수 있습니다
#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 ++ 코드로 해석됩니다.