2017-06-29 3 views
1

main.cppにを含む返しますフォルダ:クランは、システムの異なるコンパイラエラーがファイル

clang++ -std=c++0x -isystem./include main.cpp 

ただし、フォルダが正常に含まれていると失敗します。

clang++ -std=c++0x -I./include main.cpp 

./include/test.h:1:54: error: non-constant-expression cannot be narrowed from type 'int' to 'char' in initializer list [-Wc++11-narrowing]

質問:なぜ打ち鳴らすシステムと非システムファイル用に異なる動作をしますか?

+0

@jensこれは 'c'とは関係ないと確信していますか?この問題は、c警告/エラーに対しても発生する可能性があります。 – m7913d

+0

@ m7913d人々は、CまたはC++タグを両方とも関連性がすぐにわからないような質問で取り除くことについて非常に再考的です。私は誤ったタグ付けの正当な例に基づいていることを知っていますが、私は民間人があまりにも多くを過補正していると思います。しかし、この場合、私はその点を見ることができます:これはCについても同じですが、Clangが同じ動作を示していない例はありませんが、書かれた問題はC++に関するものです。 –

答えて

2

デフォルトでは、システムヘッダの警告は抑制されます。これは、C++ 11が致命的でないエラーを絞り込み、このコンテキストで診断を抑止すると考えられるようです。 the manual 1として

、ヘッダは、ディレクトリからdは、システム1(-Isystem指定)であると見なさ、このオプションを有効にする必要があると思い#includeだったとき、これを参照するには:

-Wsystem-headers

Enable warnings from system headers.

このフラグおそらくGCCから継承されており、それにはwas added in 2000があります。そのためrationaleました:

The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘ #warning ’ (see Diagnostics), are suppressed while GCC is processing a system header. Macros defined in a system header are immune to a few warnings wherever they are expanded. […]

m7913dfound GCCがやったと同じくらい博覧会を与えるものではありませんクランドキュメント、同等のセクション:

More information can be found here: Controlling Diagnostics in System Headers

しかし、コア結果は同じです。

Warnings are suppressed when they occur in system headers.

これまで見てきたように、C++ 11ではハードエラーではないと判断して抑制する-Wsystem-headersがない場合のシステムヘッダーの場合

+1

悪い仮説ではありませんが、それは_error_のように見えます。警告だけでなく、 – Ctx

+0

私は、他にも実証されるまで、少なくともいくつかのエラーもそのバナーの下に含まれていると推測します。たとえば、C++ 11のエラーを絞り込むには、コンパイルに失敗するのではなく、あいまいに定義された「診断」しか必要としません。多分それはこの要因になります。もちろん、これをテストするには、元のケースに '-Wsystem-headers'を追加して、それが何を示しているのかを見てください。 –

+1

'-Wsystem-headers'を追加すると、システムファイルであっても実際には狭いエラーが発生します。 – m7913d

関連する問題