warning C4786 – プログラミング – Home

通知
すべてクリア

warning C4786


ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

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文字に切り捨てられます。ということで
すが、いつもワーニングがでて、わずらわしいです。なにか、対策はないでしょうか?


引用解決済
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

何をインクルードしているのかの情報が必要です。
それとchar *Dictionaryの行で既にコンパイルエラーになるはずです。


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

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

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


返信引用
ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

#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つになりました。


返信引用
あー
 あー
(@あー)
ゲスト
結合: 17年前
投稿: 18
 

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


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

適切な場所に入れれば一応全て消えるはずだけど、何処で出たのか書きま
しょ。
とりあえず、プリコンパイルヘッダの前部分はプリコンパイル時の状態が使われるの
で、結果的に無視されマス。
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
使っちゃいましたが…まぁ例って事で勘弁願います。
これでも一応警告は消えます。…酷すぎる方法なのは自覚してます(笑)


返信引用
ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

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

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

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


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました