9

私が取り組んでいるいくつかのレガシーコードには、関数の引数として使用することを目的としたコンマ区切りのリストを返すマクロがあります。これは醜いですが、構成ファイルにはこれらの多くが含まれており、今は変更するのが難しいでしょう。

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

void fun_point(x,y);

fun_point(XY1);

呼び出されている関数である限り、これは正常に機能します。ただし、パラメータを使用して別のマクロを呼び出そうとすると、文字列全体が、コンマで2つの引数に分割されるのではなく、1つの引数と見なされます。

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

XY定義を変更せずにこの問題の回避策はありますか?

4

1 に答える 1

13

ちょっと。次の作品:

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

ただし、引数が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))

ここで、マクロへのすべての呼び出しを変更する必要がありますが、少なくともそれらは一貫しています。

于 2012-12-12T16:37:56.213 に答える