2012-12-12 15 views
9

私が取り組んでいるレガシーなコードの中には、関数の引数として使用するためのカンマ区切りのリストを返すマクロがあります。これは醜いですが、設定ファイルにはこれらの多くが含まれており、今変更するのは難しいでしょう。C++プリプロセッサでの引数の分割

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

これは、呼び出されている関数であれば問題ありません。パラメータを持つ別のマクロを呼び出すようにしようとしたときただし、文字列全体は二つの引数

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

XYの定義を変更することなく、この問題の回避策はあり

にコンマ1つの引数ではなく、スプリットと考えられていますか?

+2

/私はレガシーコード – icabod

+1

で握手しています。GCCのマニュアルで、ディスカッションまたはこの問題が見つかりました:http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

答えて

13

金田。

ただし、引数が1つしかない場合は、MAC_POINTからMAC_POINT1に変更する必要があります。

もう一つの可能​​性はこれです:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

は今、あなたは、マクロにすべてのあなたの呼び出しを変更する必要がありますが、少なくとも彼らは一貫しています。

+0

ああ、私余計なレベルのインダイレクションが必要な理由がわかります。ありがとう! – Quantum7