0

私たちは皆、この有名なマクロの例を知っています:

#define max(a,b) ((a) > (b) ? (a) : (b))

そして、aand をb2 回使用するため、次のようなことを行うと不正確になります。

max(x, y++); // because this gets translated to...
((x) > (y++) ? (x) : (y++)); // y is incremented twice

効果的な C++で、Scott Meyers は、関数を使用して、これに対する C++ ソリューションを提示しますinline

21st Century Cでは、同様の C ソリューションを期待していましたが、残念ながら、二重使用を避けるようにというアドバイスしかありませんでした。それは私を悲しくさせました。:'(

もちろん、いつでも通常の関数に置き換えることができます。しかし、二重使用の問題を解決する C のみのマクロ ソリューションがあるかどうか疑問に思っていました。可能な解決策はありますか?

4

2 に答える 2

5

GCC の場合、次のようにtypeof拡張子を使用できます。

#define max(a,b) \
    ({ typeof (a) _a = (a); \
        typeof (b) _b = (b); \
        _a > _b ? _a : _b; })
于 2013-01-06T08:25:40.343 に答える
3

CにはinlineC99以降の機能があります。

于 2013-01-06T08:10:59.013 に答える