2017-11-10 8 views
0

IBM Metal C Prologのパラメータ化されたプリプロセッサマクロを作成したいと思います。Cプリプロセッサで#を含む単一文字列をパラメータ化する方法は?

初期unparametrizedフォームは本当のプロローグは #pragma prolog(Foo, " #MCPROLG MAIN=(YES,16,132)") より複雑ですが、質問のために重要な部分は、文字列内の値があるということです。

#pragmaディレクティブ自体は、マクロの一部にすることはできませんので、私はそのような_Pragmaとすることを置き換える:

私はこのようにはFooをパラメータ化することができます:私は作成することができますどのように

#define STR(...) #__VA_ARGS__ 
#define PROLOG(function) _Pragma(STR(prolog(function , " #MCPROLG MAIN=(YES,16,132)"))) 

を値16をパラメータ化するマクロ?

私はプリプロセッサ内で文字列を連結する必要があるようですが、私は以下のアプローチを試みました。すべての私たちのこのstringizationマクロ:

#define STR(...) #__VA_ARGS__ 

1)トークン16に置き換えている(のは、それが交換されるように、文字列自体の中にはできませんそれsize)を名前を付けてみましょう。

#define PROLOG(function, size) _Pragma(STR(prolog(function , "  #MCPROLG MAIN=(YES, size ,132)"))) 

2)_Pragmaは、単一の文字列を受け取り、私はこのようにCの文字列の連結閲覧できません。私はこのようなプロローグの全体の第2引数stringizeない)

#define PROLOG(function, size) _Pragma(STR(prolog(function , " #MCPROLG MAIN=(YES," #size ",132)"))) 

3 :

#define PROLOG(function, size) _Pragma(STR(prolog(function , STR(  #MCPROLG MAIN=(YES, size ,132))))) 

#MCPROLGはその位stringizationトークンとして扱われないように、文字列の中に滞在する必要があるため。問題1(置換リスト内のパラメータを拡張する必要があります)、あなたは間接的な文字列化マクロが必要に対処するため

答えて

1

:あなたがしたい場合は、この可変引数を行うことができる

#define STR(X) STR_I(X) 
#define STR_I(X) #X 

を、それはここでは必要ありません(カンマあなたの文字列の中にカッコで囲まれている;プリプロセッサは一致します;例えばFOO(A=(B,C,D))FOOは関数のようなマクロです。引数は1つです)。

問題2に対処するには、すべてを文字列にする必要があります。実際には、プリプロセッサへの文字列リテラル連結(翻訳フェーズ4で実行され、翻訳フェーズ6まで文字列リテラル連結が行われないため)はありません。

#define HASH # 
#define HASHM() HASH 

関数のような変種は、あなたが生成することができます:ちょうど別のマクロ(#は特別な意味を持っていないオブジェクトのようなマクロ、でルートを)からハッシュを生成し、問題3に対処するために

他のものの隣に同じハッシュがあります(HASHMCPROLGは役に立ちません。HASH MCPROLG# MCPROLGHASHM()MCPROLG#MCPROLGを生成します)。

手でこれらの作品を、残りは簡単です:私は仮定してい

ここ
#define PROLOG(FN_,SZ_) _Pragma(STR(prolog(FN_, STR(HASHM()MCPROLG MAIN=(YES,SZ_,132))))) 

あなたはまた、プラグマプロローグ周りエンド括弧を必要とし、それが問題で、これはタイプミスでした。つまり、それは次のようになります。

_Pragma("prolog(foo, \"#MCPROLG MAIN=(YES,16,132)\")") 

...ない:トリックをしたハッシュ生成マクロ、ため

_Pragma("prolog(foo, \"#MCPROLG MAIN=(YES,16,132)\"") 
+0

感謝。 あなたはまさに括弧について書いてあります。簡潔にするために除外したMAINグループのような追加のパラメータがあり、かっこのバランスをとることができませんでした。私はその問題を修正した。 – voyta

関連する問題