2017-11-14 8 views
2

私は従来のpro * C/C++コードで作業していて、プロジェクトをVisual Studio 2015に移行しました。VSでコードをコンパイルすると、警告メッセージが表示されます100以上の場所で。警告メッセージを取り除く - 適切な方法

warning C4267: '=': conversion from 'size_t' to 'unsigned short', possible loss of data 

と対応するコードは、私は、これは単なる警告メッセージを削除します

stmt.len = static_cast<unsigned short>(strlen((char *)stmt.arr)); 

に上記のコードを変更することを計画していた

stmt.len = strlen((char*)stmt.arr); // VARCHAR stmt[500]; 

です。しかし、私は100以上の場所で修正する必要があります。この警告メッセージを取り除く方法はありますか?何らかの種類のマクロを使用している可能性がありますか? お勧めします。個人的に、私はエラーを介して動作したいと正しく修正し、けれどもあなたが

#pragma warning(disable : 4267) 

と警告をオフに切り替えることができます

おかげ

+2

@NJMRデータメンバstmt.lenをsize_t型として再宣言できれば:) –

+0

'len'メンバの型を変更しますか? –

+0

'(char *)stmt.arr'のようなCスタイルのキャストは、通常、あなたが間違っていることを示す記号です。 –

答えて

3

static_castのあなたの考えは悪いことではありません。unsignedタイプを使用しているので、オーバーフローによる未定義の動作の危険はありません。

最後に、標準ライブラリ関数を置き換えるマクロを使用すると、未定義の動作になることに注意してください。それをしないでください。

+0

あなたも値するでしょう:) – oetoni

+0

Ha。私はあなたのものを賞賛したので、ボットは何を言いますか? – Bathsheba

+0

しかし、私は100以上の場所でシャンパンしなければならない。 unsigned shortを返すマクロを使ってstrlenを置き換える方法はありますか? – NJMR

1

size_tを一貫して使用するのは正しい方法です。または、更新としてあなたにキャスティングを行います。

C4267警告のを回避し、そしてどのようにもhereを示唆し、それらを無効にするには、次のとおり

IDEONEと
#pragma warning (disable : 4267) 
マクロの#define(サンプルのみ)について

#include <iostream> 
#include <string.h> 
#define strlen(x) static_cast<unsigned short>(strlen((char *)x)) 
//I tested with ((char *)x+1) and ((char *)x+2) for variation 

using namespace std; 

int main() { 
    char stmt[] = "something"; 
    int len = strlen((char*)stmt); // VARCHAR stmt[500]; 
    cout << len; 
    return 0; 
} 

テストhere

+1

答えにタイプミスがありました。あなたが気にしないことを願っています。 – Bathsheba

+0

nope&thanksありがとうございます。私はあなたが私よりずっと速く答えているのを見た。D – oetoni

+0

@oetoni:これを付け加えた。 #define strlen(x)static_cast (strlen((char *)x))。私が間違っていれば私を修正してください。 – NJMR

関連する問題