#defineマクロで#記号をエスケープ?
-
16-09-2019 - |
質問
私は#define
に拡大する#include
マクロが、「#」記号を使用したい血みどろの詳細に入るがなければ、プリプロセッサを混乱さ。
たとえば、私はこのような何かをしたいです
#define MACRO(name) #include "name##foo"
そしてこうしてそれを使用します:
MACRO(Test)
に展開されますどの
#include "Testfoo"
謙虚#記号は、プリプロセッサが嘔吐する原因となっています。 MinGWのは私に次のエラーを与えます:
'#' is not followed by a macro parameter
私は#記号をエスケープする必要がありますが、これがさらに可能であれば私はないと思います。
はい、マクロである確かに悪...
解決
私の知る限り、あなたが定義内の別のプリプロセッサディレクティブを使用することはできません覚えてます。
他のヒント
これはの前処理トークンストリームにハッシュ・トークンを挿入するために、の可能性です。次のようにあなたがそれを行うことができます:
#define MACRO(hash, name) hash include name
MACRO(#,"hello")
に-expands
# include "hello"
がを、標準明示的前処理指令の存在のために、このようなラインの任意のさらなる分析を除外[cpp.rescan]:
得られた完全にマクロ置き換え前処理トークン列は、それがいずれかのような場合でも、前処理指令として処理されていない。
問題は、実際にあなたのプリプロセッサの出力に#記号を取得されていません。
どうやらあなたは、プリプロセッサは、マクロ展開の一環として、新たに作成されたの#includeディレクティブに対処するために、あなたのファイルを再解析します。それはそのように動作しません。行が#で始まる場合、それはプリプロセッサと解釈する命令です。行が#で起動しない場合、それはマクロ置換を含むプリプロセッサへの変換のみ対象です。これは一回あたりのラインテストです。
MACRO(Test)
#で起動しません。したがって、それはプリプロセッサディレクティブとして解釈されません。代わりに、それはマクロ置換ルールに従います。
このです。
# means quote the following token (which should be a macro parameter name)
## means concatenate the preceding and following tokens.
あなたの状況では#は、適切なトークンが続いていません。 だからあなたのような状況で、我々は間接のレベルを通過する必要があります:
#define QUOTE(name) #name
#define TEST(name) QUOTE(name ## foo)
#include TEST(scot)
あなたはそれを行うことはできません。プリプロセッサディレクティブは、マクロ展開前に認識されています。マクロは、プリプロセッサディレクティブのように見えるものに展開した場合、そのディレクティブが認識されません。あなたができる最善のは、ファイル名のマクロを作成されます:
#define MACRO(name) "name##foo"
...
#include MACRO(Test)
このの(それはパラメータなしで通常の#define
マクロのために動作しますが、私はパラメータを持つマクロでそれをテストしていない)の仕事かもしれません。
#define MACRO(name) <name##foo>
#include MACRO(Test)
#define HASH_SIGN #
BOOST_PP_CAT(HASH_SIGN, include)
#define PARAM_NAME Param
#define GETNAME_(a) #a
#define GETNAME(a) GETNAME_(a)
int Param;
printf("%s = %i\n", GETNAME(PARAM_NAME), PARAM_NAME);