2017-01-03 5 views
-4

ファイルからヘッダを作るBase.hC/C++プリプロセッサ名前

class Base { 
} 

ファイルファイルB.h

class B : public Base { 
} 

ファイル

class A : public Base { 
} 

A.h C.h

#define D_CLASS A 

ファイルC.cpp

#include "c.h" 
#include D_CLASS##.h   // <--- how to make the header from class name? 

Base * pBase = new D_CLASS() ; 

これを行うことでインセンティブ...異なるオペレーティングシステムをサポートして
システム、各OSは、特定の機能を提供するために作成するためのビルダーにクラスの名前を教えてファイルヘッダました。
ユーザーが、それは彼がその機能と彼の特定のクラス名を定義することも必要である新しいOSだ追加されます。これは、基本的には、このように展開

#define PP_ADD_HDR_SUFFIX(x) PP_ADD_HDR_SUFFIX_IMPL(x) 
#define PP_ADD_HDR_SUFFIX_IMPL(x) x.h 

#define PP_QUOTE(x) PP_QUOTE_IMPL(x) 
#define PP_QUOTE_IMPL(x) # x 

#define CLASS_HEADER_NAME(name) PP_QUOTE(PP_ADD_HDR_SUFFIX(name)) 

#include "C.h" 
#include CLASS_HEADER_NAME(D_CLASS) 

Base * pBase = new D_CLASS(); 

+0

ここでは、なぜCタグ? –

+2

これを行わないでください。あなたのツールを使って作業しないでください。 – Ben

+1

は、#include D_CLASS ## '入力している。そんなに簡単に'の#include a.h'を入力するよりもを 'H? – NathanOliver

答えて

0

あなたは、このようにそれを行うことができます

#include #D_CLASS.h 

(秒)「#」のファイル名の前後に文字列リテラル(引用符を作成することです)実際にはマクロ展開だけのトークン貼り付けは必要ありません。

しかし、他にも言及したように、これには良いユースケースが必要です。

「設定可能な」ヘッダーファイル(設定可能な前置詞/クラスの名前空間)をサポートしたいと思っていた過去にこれを行いました。そして、私が覚えている限りでは、結局それはかなり乱雑に見えていました。あなたは、 "前処理" システムヘッダ(のような#include <my_name.h>)したい場合は、あなたが行うことができます

同様

、:

#define CLASS_NAME my_name 

#define CLASS_SYSTEM_HEADER_NAME(name) CLASS_SYSTEM_HEADER_NAME_IMPL(name) 
#define CLASS_SYSTEM_HEADER_NAME_IMPL(name) <name.h> 

#include CLASS_HEADER_NAME(CLASS_NAME) 
+0

実際に試してみましたか? CTYPE「と 『:』貼り付けエラー:」(http://coliru.stacked-crooked.com/a/970792cf9a7e6aa1)[coliruに住ん]:それは(おそらくMSVCのような非標準のプリプロセッサを除いて)動作しません。 "有効な前処理トークンが与えられていません" – rici

+0

MSVCで動作しました。しかし、(私はそれがほとんどのコンパイラで働いていたことを知っているので、私はそれを見てみます多分私は過去にそれがわずかに異なるでした)異なるコンパイラにしようとします。 – axalis

+0

少なくともMSVCとGCC(私がテストした)で動作するバージョンで更新されました。実際には、トークンの貼り付けはまったく簡単です。 (これもcoliruの例で動作することがテストされています) – axalis

関連する問題