Cプリプロセッサトークンでアンダースコアをエスケープする方法は?
-
02-07-2019 - |
質問
次のスニペットは、PROJECT(Makefileで定義)の値を取得することになっています そして、インクルードファイル名を作成します。たとえば、PROJECT = classifierの場合、最後にPROJECTINCSTRのclassifier_ir.hを生成する必要があります
接尾辞にアンダースコアを使用しない限り、このコードが機能することがわかります。ただし、アンダースコアの使用はオプションではありません。コードベースはアンダースコアをすべての場所で使用します。 PROJECTの値の数は限られているため、これを回避できますが、アンダースコアを使用して、次のスニペットを実際に機能させる方法を知りたいと思います。エスケープできますか?
#define PROJECT classifier
#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)
#include PROJECTINCSTR
編集:コンパイラは、PROJECT_ir.hではなく、classifier_ir.hをインクルードする必要があります。
解決
#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define SMASH(x,y) x##y
#define MAKEINC(x) SMASH(x,_ir.h)
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)
他のヒント
これは私のために働く:
#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC(x) MAKEINC(x)
#define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT))
#include PROJECTINCSTR
このベアボーンの例はgcc(v4.1.2)で動作し、" PROJECT_ir.h"を含めようとします
所属していません StackOverflow