2016-07-21 8 views
5

この問題を解決しようとしています:C++ How can I prevent my team developers from using integer version of abs by mistake?マクロを使用してabs機能をもう使用できなくしました。プリプロセッサ文を使用して標準機能を禁止することはできませんか?

myabs(3);を含むコードをg ++オプション-Dmyabs=absでコンパイルすると、(myabsabsに置き換えられます)、コンパイルされます。

abs(3);を含むコードをg ++オプション-Dabs=forbiddenでコンパイルするとコンパイルされます...なぜそれが報告されないのですかforbiddenは不明ですか? absのように見えますが、前処理中にforbiddenに置き換えられません...なぜですか?

答えて

1

前処理中にabsが置き換えられないように見えます...なぜですか?

マクロ未定義、::absを定義し、私は(のlibstdC++)を使用し、少なくとも標準ライブラリのヘッダー:

// Get rid of those macros defined in <math.h> in lieu of real functions. 
#undef abs 
#undef div 
// ... 

あなたのヘッダが同じことをやっている可能性があります。このような定義がない場合、プリプロセッサマクロを使用してそのような機能を禁止することは実際には不可能です。

+0

インクルードガードによって保護されている場合は、-include cmathコンパイラ引数を指定して強制的にabsマクロ(未試行)を定義することができます – matt

+0

幸いです: 'abs 'は' math'を含める前に 'forbidden'後ではないので、#undef absを実行する必要があります – jpo38

関連する問題