■ C1083
MESSAGE
file `` が開けない
DESC
Link, Compile , PreCompileHeader などの file が見つからない
SOL
PATH を変更する
■ C2017
Define の \ の跡に SPACE があった
要は Escape は "" ないにないとだめ
■ C2589
class Foo{};
Foo::int a;
..\console.cpp(70) : error C2589: 'int' : スコープ解決演算子 (::) の右側にあるトークンは使えません
DESC
[ :: ] の右側には Class, Struct, Union 名のどれかを指定すること。
または 任意のメンバだけですよ !
クラス、構造体、または共用体の名前がスコープ解決演算子 (::) の左側にあるとき
右側のトークンにはクラス、構造体、あるいは共用体のメンバを指定する必要があります
それ以外の場合、右側には任意のグローバル識別子を指定できる
スコープ解決演算子はオーバーロードできない
次の例では C2589 エラーが生成されます
■ C2220
MESSAGE
警告はすべてエラーとして処理されますエラーが発生したため、オブジェクトまたは実行可能ファイルは生成されませんでした
DESC
コンパイルオプション "/WX" を指定したため Warning をエラー扱いにしてコンパイルが中断された。
Warning をエラー扱いにしたくないなら /WX を指定しない、または すべての Warning をなくす。
// error C2220: 警告をエラーとして扱いました'object' ファイルは生成されません
// warning C4101: 'i' : ローカル変数は 1 度も使われていません
int main() {
int i;
return 0;
}
■ C2632
MESSAGE
'type1' の後に 'type2' を記述するのは正しくありません
DESC
int, float
// Type Identifier が連続するといわれる
int float i; // C2632
// bool が定義すみの環境では C2632
< typedef unsigned char bool;
■ C2653
..\foo.cpp(56) : error C2653: 'std' : 識別子がクラス名でも名前空間名でもありません
[ std ] という Class, NameSpace は知りません と Compiler がいっている
■ C4100
参照されない 仮引数の警告
WarningLevel4 の対策
解決方法
消す || 参照する. (void)arg; || arg; // (void) 型に cast
MESSAGE
';' : 制御が空の文が見つかりました意図した記述でしょうか
DESC
if (1); 制御文の後に ; があるときにでる
EX
int main() {
int i = 0;
if (i); // C4390
i++;
}
POINT
MACRO を展開したときにこうなる可能性がある
■ C4390
MESSAGE
';' : 制御が空の文が見つかりました意図した記述でしょうか
DESC
if (1); 制御文の後に ; があるときにでる
EX
int main() {
int i = 0;
if (i); // C4390
i++;
}
POINT
MACRO を展開したときにこうなる可能性がある
■ C4267
DESC
64bit 環境の size_t 型から, 小さいサイズの型に変換する際に発生する。
size_t は環境ごとに次のように定義されている
// 32bit
typedef unsigned int size_t;
// 64bit
typedef __int64 size_t
■ C4244
MESSAGE
'引数' : 'type1' から 'type2' への変換です。データが失われる可能性があります。
DESC
浮動小数点型が整数型に変換されました。データが失われた可能性があります。
互換性のある型を使用するようにプログラムを変更するか
別の論理をコードに追加するかして、変換される値の範囲が使用する型と常に互換性があるようにする
int f(int x){ return 0; }
int main() {
double x = 10.1;
int i = 10;
return (f(x)); // C4244
// try the following line instead
// return (f(i));
// C4244
float f = 10;
}
範囲内にあるときも同様になる
float f = 1000;
WARNING
// 範囲外にあれば int 型のデータは float 型へ変換した際に欠落する
float f = 1024 * 1024 + 1;
float i = f;
引数' : 'unsigned int' から 'float' への変換です。データが失われる可能性があります。
■ C4018
MESSAGE
'expression' : signed と unsigned の数値を比較しようとしました。
C4018: '< ' : signed と unsigned の数値を比較しようとしました。
signed 型の数値と unsigned 型の数値を比較するには、コンパイラで signed 型の値を unsigned 型に変換する必要があります。
signed 型と unsigned 型をテストするときに
どちらか一方の型をキャストすると解決することがあります。
POINT
マイナスの値と比較するとエラーが発生する
逆に正の値しか扱わない場合はエラーにならない
for( int i=0; i< listLog.size(); i++ ){
■ C4800
MESSAGE
'int' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)
'type' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)。
非 bool 値を bool 型に代入するか強制的に変換するとこの警告が生成されます。
値 true または false しか取らない int 変数を bool 変数に代入しており、
bool 型として再宣言できる場合が含まれます。
bool 型を使用するように式を書き直すことができない場合は、式に "!=0" を追加して bool 型にできます。
式をただ bool 型にキャストしても、この警告が生成されます (設計仕様)。
// compile with: /W3
int i = 0;
// try..
// bool i = 0;
bool j = i; // C4800
j++;
■ C4291
MESSAGE
'void *Test::operator new(size_t,unsigned int) throw()' : 初期化コードが例外をスローすると、'new' 演算子を使用しているとメモリを解放しません。
DESC
宣言' : 初期化コードが例外をスローすると、'new' 演算子を使用しているとメモリを解放しません。
仮引数付きの new が使用されていますが
該当する仮引数付きの delete がありません。
new 演算子でオブジェクトにメモリを割り当てると
そのオブジェクトのコンストラクタが呼び出されます。
コンストラクタが例外をスローした場合は、オブジェクトに割り当てられていたメモリを解放する必要があります。
new 演算子と一致する operator delete 関数がない場合、メモリの解放はされない。
余分な引数を付けずに new 演算子を使用し、/GX、/EHs、または /EHa の各オプションでコンパイルして例外処理を有効にすると
コンストラクタが例外をスローしたときに delete 演算子を呼び出すコードが生成されます。
仮引数付きの new 演算子
つまり割り当てサイズ以外の引数を伴う形式の new 演算子を使用すると、
コンストラクタが例外をスローしたときにも、
delete 演算子を呼び出すコードは生成されます。
これは、メモリを割り当てた仮引数付きの new 演算子と一致する仮引数付きの delete 演算子がある場合だけです。
仮引数付きの new 演算子と一致する仮引数付きの delete 演算子が定義されていないため、警告 C4291 が生成されます。
この問題を解決するには、main の前に次のコードを挿入します。
オーバーロードされた operator delete 関数のパラメータは、最初のパラメータを除き、
すべてオーバーロードされた new 演算子と一致することに注意してください。
// throw を宣言すると 例外が投げられることになる
void* operator new(size_t t, unsigned int id ) throw();
// 宣言をしないと エラーにならない
void* operator new(size_t t, unsigned int id ) ;
■ C4305
MESSAGE
'identifier' : truncation from 'type1' to 'type2'
識別子が小さい型に変換されるため、情報が失われます。
// float 型に double 型の値をいれる発生する
v.set( 0, 0.142857, 0.342857 );
// 型に合った値をいれればなおる
warning C4305: '引数' : 'double' から 'float' へ切り詰めます。
■ C4312
MESSAGE
'type1' からより大きいサイズの 'type2' へ変換します。
DESC
この警告は 64 ビットの移植性の問題を検出します。
64 ビットの型に対して 32 ビットの値を割り当てようとしました。
32 ビット int または 32 ビット long を 64 ビットポインタにキャストしています。
符号の拡張が発生する場合、
一部の環境では
これは安全でない変換になります。
int 型よりもサイズが大きいポインタ型に負数が割り当てられると
符号の拡張 が発生するため
ポインタ型の値が int 型の値と異なるメモリ アドレスを参照するようになります。
この警告は
/Wp64 が使用されている場合にのみ出される。
// C4312.cpp
// compile with: /W1 /Wp64 /LD
void* f(int i) {
return (void*)i; // C4312
}
// OK
void* f2(__int64 i) {
return (void*)i;
}
■ C4313
MESSAGE
'function' : 書式指定文字列内の 'format specifier' が 'type' 型の引数 %d と競合しています
POINT
printf() の format 指定子 が, 引数の型と矛盾したときにおきる。
{
void *p = malloc( 1024 );
// ERROR
// 64bit pointer
printf( "%d", p );
// OK
printf( "%p", p );
printf( "%Id", p );
}
64 ビット整数を保持できる %d 書式指定子に 32 ビット ポインタを渡している。
この警告が有効なのは /Wp64 オプションを使用している場合だけ
■ C4313
■ オーバーロードのどれも、すべての引数の型を変換できませんでした
DESC
問題箇所の関数がどれもオーバーロードする関数にならないということ。
引数が間違っているかチェックすること。
■ C4996
MESSAGE
DESC
セキュリティ的に推奨されない関数が利用されている。
FILE *fp = fopen( "test.txt", "r" );
warning を消すには _CRT_SECURE_NO_WARNINGS を定義するか、
warning プラグマ を利用する
#pragma warning(disable : 4996)
cl /W4 /D"_CRT_SECURE_NO_WARNINGS" main.cpp
■ C4530
MESSAGE
FILE(LINE) : warning C4530:
C++ 例外処理を使っていますが、アンワインドセマンティクスは有効にはなりません。
/EHsc を指定してください。
原因
標準 C++ ライブラリを使用するプログラムは、
C++ の例外処理を有効にしてコンパイルする必要がある。
( 理由は ライブラリが例外処理をつかっているから )
解決方法
/EHsc オプションを有効にする。
[C/C++] > [コード生成] > [C++ の例外を有効にする]
cl /EHsc
// 標準ライブラリを利用する
#include< string>
std::string s( "test" );
標準ライブラリを利用する場合は、例外処理を有効にしてコンパイル(コード生成)をする。
標準ライブラリを利用しないでも C++例外処理を使うと( try { 文の箇所で ) warning が発生する。
try {
throw "例外が発生しました";
}
catch( const char* str ){
printf( "例外をキャッチしました\n" );
}
デストラクタがすべてのオブジェクトに対して呼び出されない場合があります。
ただし初期化されていない関数ポインターを通じて関数呼び出しを実行しようとして
その関数として呼び出す前に作成した
パラメーターのオブジェクト
たとえば構造化例外が発生する場合これらのオブジェクトに
アンワインドするスタック中に呼び出されたデストラクターはありません。
REFERENCE Exception