2017-08-18 28 views
1

_Pragmaの引数は文字列なので、普通のcプリプロセッサの方法で文字列を貼り合わせると(つまり、隣り合わせに) _Pragmaの引数の新しい文字列。しかし_Pragmaの引数に文字列を連結する方法

_Pragma("GCC Poison " "puts") 

はどのようにこれを回避することができますか?

error: _Pragma takes a parenthesized string literal 

エラーで失敗しますか

この特定の例では、非常に有用ではありませんし、それらを開始するには、すべて1つの文字列作るの自明な解を持っていますが、最終目標は、それが

+1

DO_PRAGMAマクロはここにあります(https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html)? –

+0

'_Pragma(" GCC Poison "" puts ")'を試しましたか? – Yunnosch

+0

@Yunnoschはい、また失敗します。 @ユージーンSh。そのDO_MACROは有望ですが、私はまだ可能なことをテストしなければなりません – rtpax

答えて

0

DO_PRAGMAマクロin the GNU docs次のように定義されているにマクロをstringizeすることです

#define DO_PRAGMA(x) _Pragma (#x) 

これを使用すると、2つの別々のトークンをストライピングしないで並べると、それらはストリング化されます。定義内のマクロを展開するには、それは間接の1つのレベルを通過するので、あなたは、ユージンのShにこの

#define POISON(name) DO_PRAGMA(GCC poison name) 
POISION(puts)//becomse _Pragma("GCC poison puts") 

おかげのようなさまざまなプラグマのための速記を作成することができ

これを使用して
#define DO_PRAGMA_(x) _Pragma (#x) 
#define DO_PRAGMA(x) DO_PRAGMA_(x) 

として定義する必要があります。 DO_PRAGMAマクロ

関連する問題