2016-10-11 8 views
0

私はコードセクションを再利用可能にしようとしています。私はABC_LENに解決するためにLOG_SIZEを希望Cでマクロ内のマクロを置換する

#define NAME ABC 
#define LOG_SIZE NAME##_LEN 

:以下の私のコメントの抜粋は、私はそれを望んで何をしていません。私は#で再生しようとしましたが、これを動作させることができませんでした。これを実行する方法はあり

#define LOG_SIZE(name) name##_LEN

LOG_SIZEは、すべてのコード上で使用されているので、私はにマクロを変更したくありませんか?

答えて

3

マクロ引数が文字列化されたり、別のトークンに連結されたりすると、マクロ引数が自動的に展開されないという問題があります。

C99 6.10.3.1/1:

関数のようなマクロの呼び出しの引数が識別された後、引数の置換が行われます。 #または##プリプロセストークンまたは##プリプロセストークン(後記参照)が続く場合を除いて、置換リストのパラメータは、そこに含まれるすべてのマクロが展開された後で対応する引数に置き換えられます。置き換えられる前に、各引数の前処理トークンは、前処理ファイルの残りの部分を形成するかのように完全にマクロ置換されます。他の前処理トークンは利用できません。

あなたはNAMEを渡し1と_LENでそれを連結し1の間に別のマクロを追加することでこの問題を回避することができます。あなたが興味があれば

#define NAME ABC 
#define AFTERX(x) x##_LEN 
#define XAFTERX(x) AFTERX(x) 
#define LOG_SIZE XAFTERX(NAME) 

LOG_SIZE 
//evaluates to ABC_LEN 

gccのマニュアルはSection 3.10.6: Argument Prescan

で、さらに詳細に入ります
関連する問題