warning C4786

[戻る]
ガラ 2008/04/04(金) 17:45:08
XP VC++6.0

int main(int argc, char* argv[])
{
  char *Dictionary={"Kaori","Ayumi","Syota","Isamu","Seiko","Aki","Gara"} ;
  vector <string> wA ;//この宣言をするとワーニングがでます
    
  for (int i = 0 ; i < sizeof(Dictionary)/sizeof(UCHAR *); i++) {
      wA.push_back(Dictionary[i]) ;
  }

  return(0) ;
}
//こんな長いワーニングがでます。
warningC4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<ch
ar>,std::allocator<char> > const 
*,std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const 
&,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const 
*,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。

内容は、デバッグ用文字列が長すぎて、255文字に切り捨てられます。ということで
すが、いつもワーニングがでて、わずらわしいです。なにか、対策はないでしょうか?

たいちう 2008/04/04(金) 18:28:25
何をインクルードしているのかの情報が必要です。
それとchar *Dictionaryの行で既にコンパイルエラーになるはずです。

2008/04/04(金) 18:49:57
>なにか、対策はないでしょうか?
プラグマで特定の警告を特定の範囲で無効に出来ます。
#pragma warning( disable : 4786 )
ですね。

制限に引っかからない事が最善ではありますが。

ガラ 2008/04/04(金) 20:57:39
#pragma warning( disable : 4786 )

#include "stdafx.h"
#include <vector>
#pragma warning( disable : 4786 )

using namespace std;
int main(int argc, char* argv[])
{
    char *Dictionary[]=
{"Kaori","Ayumi","Syota","Isamu","Seiko","Aki","Gara"} ;
    vector <string> wA ;

    
    for (int i = 0 ; i < sizeof(Dictionary)/sizeof(char *); i++) {
        wA.push_back(Dictionary[i]) ;
    }

    return(0) ;
}

たいちろうさん、すいません。さきほどは、TAB整理をしていて、[]を消してしまい
ました。
麩さん、レスありがとうございました。pragma warning( disable : 4786 )を2ヵ所に
いれてみましたが、ワーニングは、すべて消えません。4つから2つになりました。

あー 2008/04/04(金) 22:05:01
>制限に引っかからない事が最善ではありますが。
確かVC6だと標準のヘッダ内とかでも警告されるからそうも言ってられんのだよな

2008/04/06(日) 23:26:53
適切な場所に入れれば一応全て消えるはずだけど、何処で出たのか書きま
しょ。
とりあえず、プリコンパイルヘッダの前部分はプリコンパイル時の状態が使われるの
で、結果的に無視されマス。
"stdafx.h"の中でプラグマやっちゃうか(これも危ないけど)、
----
#include "stdafx.h"
#pragma warning( disable : 4786 )
#include <vector>
#include <string>
…
std::vector <std::string> wA ;
----
としましょう。stringインクルードとかusing使わないのは気分ですが、予防的な意
味も含めてやっとくべきかと…。using namespaceは名前の衝突が怖いので。


>確かVC6だと標準のヘッダ内とかでも警告されるからそうも言ってられんのだよな
なんですよね…こればっかりはなんともしがたいというか。
除いてみるとこういうプラグマも混ざってるようですし。
一応、関連するテンプレートクラスを片っ端から非テンプレートとして派生させて
別名にするとか小細工はできるけど…

using namespace std;
class str :public std::string{
public:    str(char *a):string(a){};
};
…
std::vector <str> wA ;
ちょっとコンストラクタで別ネームスペース指す方法が分からなかったのでusing
使っちゃいましたが…まぁ例って事で勘弁願います。
これでも一応警告は消えます。…酷すぎる方法なのは自覚してます(笑)

ガラ 2008/04/07(月) 08:04:58
麩さん、たいへんありがとうございます。
ワーニングが50ほどでてしまって、その中にエラーが混じるので、
エラーをさがすだけでも、大変になっていました。
#include "stdafx.h"
のあとでないとだめなんですね。(なぜだか、わかりませんが・・・)

>using namespaceは名前の衝突が怖いので。

なるほど、みなさん、std::vectorというふうに使われるので、不思議におもっていまし
た。なるほど、そういうわけがあったわけですね。

2008/04/08(火) 00:25:02
>#include "stdafx.h"
>のあとでないとだめなんですね。(なぜだか、わかりませんが・・・)
「プリコンパイル済みヘッダー ファイル」で調べれば分かると思いますが…
"stdafx.cpp"コンパイル時に"stdafx.h"インクルードまでの処理結果をPCHに保
存して、他のファイルでは"stdafx.h"インクルードまでをスキップして代わりにPCH
を読み込む仕組みです。
"stdafx.h"をインクルードするまでの処理が全てで共通である事を前提に使う仕
組みなので、"stdafx.h"インクルード前に何かやると不味い事になります。

"stdafx.cpp"や"stdafx.h"はVCでプロジェクトを作ったときの標準というだけで、
これ以外の場合もあります。
windows.h辺りは結構規模が大きいので、それをPCH一つ読み込むだけで完
了させられるとかなりの高速化になります。

古いスレッドには追加発言できません。