2017-05-27 8 views
7

私はオプションC++ 14でthe codeをコンパイルしようとした:<algorithm>はマクロXを定義していますか?

#define X static_cast<double>(2) 
#include <algorithm> 
// if you change the two lines, no error occurs 

int main() 
{ 
    return 0; 
} 

しかし、私はXの後にエラーが発生します。

error: expected ',' or '...'

私はオプションC++ 98でエラーを得ることはありません。私のgccバージョン4.8.4では、エラーは出ませんが、5.4.0ではエラーが発生します。これはバグですか?私は何か間違っているのですか?

+0

gcc6 – vsoftco

+0

[提供できない](https://godbolt.org/g/Xv0ksm)のコードで提供されているエラーはありません。 がマクロを定義しているかどうかについては、ドキュメントをチェックすることができます。 – DeiDei

+0

だから私はリンクを提供した。それがバグであれば、リンクされているプロバイダよりも影響を受けるバージョンを使用する可能性があります。だから@DeiDei、それはバグですか、私はすべてうまくいったのですか?もしそうなら、それを受け入れる答えを出してください。 – DanielTuzes

答えて

8

私のローカルg ++ 5.4.0インストールで同じエラーが発生します。私はg++ -E出力を見て、エラーがライン252と254を/usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.hするためのトレースを思わ:

/* Write flags register */ 
extern __inline void 
__attribute__((__gnu_inline__, __always_inline__, __artificial__)) 
__writeeflags (unsigned long long X) // 252 
{ 
    __builtin_ia32_writeeflags_u64 (X); // 254 
} 

これを考慮することができます予約されていない#defineはそれらと競合していないため、コンパイラにバンドルされているライブラリのバグです。 (同じヘッダ内の他の機能は、パラメータ__Xを使用します。

+2

これがプリプロセッサが悪い理由です。 – DeiDei

+0

これはバグです。標準ライブラリでは、この問題のために予約されたもの以外の識別子は使用しないでください。 Stephan T. Lavavejは、STLの実装では、すべてのコーナーケースで動作することを確認するために長さについて情熱的な独白を与えました(ユーザーは悪いとみなし、標準内で許可された奇妙なことをすべて行うでしょう; 。ユーザー定義のマクロは扱いやすいです(Xのような名前は使用しないでください)。オーバーロードされた演算子を持つユーザー定義型は、より多くの苦痛を与えます。 –

+0

これは興味深い質問を提起します。このようなユーザー定義マクロの問題から自分の_own_ヘッダーを保護する方法はありますか? –

関連する問題