1

C ++の入門書(5番目)では、次のように述べています。

組み込み型の変数で使用する場合、この形式の初期化には 1 つの 重要なプロパティがあります。初期化子が情報の損失につながる可能性がある場合、コンパイラは組み込み型の初期化変数をリストできません。

longdouble ld = 3.1415926536;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld;  // ok: but value will be truncate

gcc4.8.1 を使用してコードをコンパイルすると、エラーではなく警告のみが表示されます。

g++  -W -Wall -Wextra -pedantic -std=c++0x  -o m main.cpp


main.cpp: In function ‘int main()’:
main.cpp:64:13: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 
             ^
main.cpp:64:22: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 

重要なプロパティの機能をオンにするフラグはありますか?

4

2 に答える 2

2

「gcc 診断フラグ」をすばやく検索すると、ドキュメント リソースが表示されます。

プログラム内で、これを行うことができます:

#ifdef __GNUC__
#   pragma GCC diagnostic error "-Wnarrowing"
#endif

コマンドライン オプションもあります-Werror=narrowingが、GCC に従ってプログラム自体のセマンティックな意味を変更したいので、ソース コードに入れる方がおそらく適切です。

過負荷の選択など、単純な整形式以外の違いが生じる場合、GCC は状態を正しく診断することに注意してください。

于 2013-07-10T00:35:15.337 に答える
1

標準は、エラーや警告を要求することはありません。標準は、診断を発行するための実装のみを必要とします。このような診断がコンパイラ エラー、警告、またはそれらの両方とはまったく異なる形をとるかどうかは、標準の範囲外です。

于 2013-07-10T00:59:53.010 に答える