Cプリプロセッサトークンでアンダースコアをエスケープする方法は?

StackOverflow https://stackoverflow.com/questions/141878

  •  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"を含めようとします

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top