3

私は私のレガシーコードにこれを持っています

#define max(x, y)   (x > y ? x : y)
#define min(x, y)   (x < y ? x : y)

そのBeanはアプリケーションでallotを使用しましたが、今はfreeBSDでコンパイルしようとしていますが、次のようになります。

/usr/include/c++/4.2/bits/istream.tcc:123:35: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:124:45: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:143:33: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:144:43: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:438:48: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:441:53: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:449:47: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:489:48: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:493:53: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:501:47: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:507:53: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2/bits/istream.tcc:806:43: error: macro "max" requires 2 arguments, but only 1 given

コード内のメソッドの名前(マクロ)だと思います。
現在、名前を変更して多くの作業を行っています。
どうすればそれを使い続けることができますが、コンパイラが混同するのを避けられますか?

4

1 に答える 1

4

そもそもそれらのマクロを定義する理由は何でしたか?これはC++であり、マクロは必要ありません。特に、標準で関数として既に提供されているマクロは必要ありません(愚かでマクロ<windows.h>についての苦情を含めたり、受け取ったりするときは、常に気になります)。minmax

そうは言っても、迅速で汚い解決策は、マクロ定義を次のように置き換えることかもしれません。

#include <algorithm>
using std::min;
using std::max;

ただし、これは依然としてグローバル名前空間を汚染します。これらは、ローカル変数やその他の関数やメソッドによって非表示にできる適切な関数名であり、どこでも愚かなテキスト置換プリプロセッサに置き換えられるだけではありません。

それ以外の場合は、それらのマクロ(またはusings)の前にシステムインクルードファイルを含めることを検討してください。

于 2012-08-25T15:00:45.217 に答える