別のプリプロセッサディレクティブにプリプロセッサマクロ展開
-
12-09-2019 - |
質問
当初、私は私がこれを必要と思ったが、私は最終的にそれを回避しました。しかし、私の好奇心(と知識のための食欲、ハムが)私が尋ねる作ります:
タグでのインスタンスのプリプロセッサマクロ、缶
#include "MyClass.h"
INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)
別に展開する
のように、含ま#include "MyClass.h"
#include "FooTemplate.h"
template class FooTemplate<MyClass>;
?
解決
私はそれを行うことができないと信じて、これはあります。だから、他のプリプロセッサディレクティブを放出することはできません。
具体的には、C99標準から(6.10.3.4項3):
単項完全に得られた3 マクロ置き換えトークン前処理 シーケンスは、次のように処理されません 前処理指令であっても、それであれば 1を、似ている...
_Pragma
演算子はC99に追加された理由興味深いことに、これがあります。 #pragma
はマクロでemitedが、できなかったので_Pragma
缶ます。
他のヒント
C標準は、ディレクティブ( - - 6.10(2)前処理指令C99)の前処理については、これを言います
前処理ディレクティブは、で始まる前処理トークンのシーケンスで構成します その#前処理トークン(翻訳フェーズの開始時に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
(つまり、前の2つの形式のいずれかと一致しない)、許可されています。前処理 ディレクティブに含まれた後、トークンは、単に通常のテキストのように処理されます。 (各 現在マクロ名として定義された識別子は、その置換リストに置き換えられます トークンを前処理。)
すべてのプリプロセッサディレクティブは、マクロ展開が始まる前に、ありませんので、あなたはマクロが#includeディレクティブに拡張し、そのようなものとして解釈されてきたことはできません解釈されます。代わりに、(誤った)C ++コードとして解釈されます。