MFCとSTLの両方を使おうとしたところ、MFCのDEBUG NEWとSTLがかぶってしまうようで、デバッグ版のビルドにおいてエラーがでてしまいます。リリース版では問題ないようです。どのように解決したらいいのでしょうか。ぜひご教示ください。

このQ&Aに関連する最新のQ&A

とは MFC」に関するQ&A: MFC71.DLLとは

A 回答 (1件)

わたしが以前やったときは確かPreCompileHeader周りの性でうまくBuildで着なかった記憶があります。


確か標準のProject設定ではafx何ちゃら.hまでプリコンパイルする設定だったと思うので、STL関連のInclude記述の位置を変えるか、PreCompileHeaderの設定を切ることで回避したような・・・

なにぶん過去の話なんでいまいちはっきり覚えてないので・・・
とりあえず試してみてはいかがでしょうか?

# 最近MFCと戯れることがめっきり減ってますんで(笑)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
STLのインクルードをstdafx.hの中にもってくることで自己解決しておりました。理由がいまいちピンとこないのですが、、

お礼日時:2002/02/14 20:20

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qデバッグビルドとリリースビルドで計算結果が違う

こんにちは。
VC++.netで暗号化ソフトを作っているんですが、デバッグモードで実行した結果と、リリースモードで実行して得られる結果が違うので困っています。
原因としては、何が考えられるでしょうか?

warningで、「warning C4267: '=' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。」と表示されましたが、(int)でキャストしてから警告は出なくはなっているんですが。

もう一つ、「LINK : warning LNK4089: 'SHELL32.dll' へのすべての参照は /OPT:REF によって廃棄されます。」と出ていますが、これは関係なさそうですので無視しています。

もしかして、同じような経験をされた方がいるんではないかと思い質問しました。
よろしくお願いします。

Aベストアンサー

値を初期化しないで使用した時に、この現象が発生する可能性が高いです。
例えば、関数のなかで、int a;と変数を動的変数として宣言し、このaを初期化せずに、
int b = a*a;
を実行した場合、デバッグモードの場合は、0になる可能性が高く、リリースモードの場合は、不定(前回のスタック領域で使用された値)になります。

QDebug版とRelease版で結果が変わる

Visual Stadio 6.0 C++でDLLを作成した所、
Debug環境で行った結果とRelease環境で作成したDLLの実行結果が変わってしまいます。
この原因について何か思い当たる事がありましたら、教えて下さい。
宜しくお願いします。

Aベストアンサー

 こんばんは。

 まぁ、それが理由であるかは断言は出来ませんが、VC6には末恐ろしいバグもあるご様子で・・・。
 確かヘルプに、最適化をしておかしくなるケースと理由が記載されていた様な気がします。

 後、関数内にStatic変数宣言が置かれていると、最適化でインライン展開された時、展開された個数分のStatic変数領域が出来上がります(本当は一つの筈なのだが)。
 結果として、おかしくなります。
 「プロジェクトの設定 → C/C++ → 最適化 → 関数のインライン展開の制御」で「適合可能なもの全て」が選択されている時には要注意です。

 「VC6 最適化 バグ」
 http://www.google.co.jp/search?hl=ja&q=VC6%E3%80%80%E6%9C%80%E9%81%A9%E5%8C%96%E3%80%80%E3%83%90%E3%82%B0&lr=

 「VC6 サービスパック6」
 http://www.microsoft.com/downloads/details.aspx?familyid=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=ja

 こんばんは。

 まぁ、それが理由であるかは断言は出来ませんが、VC6には末恐ろしいバグもあるご様子で・・・。
 確かヘルプに、最適化をしておかしくなるケースと理由が記載されていた様な気がします。

 後、関数内にStatic変数宣言が置かれていると、最適化でインライン展開された時、展開された個数分のStatic変数領域が出来上がります(本当は一つの筈なのだが)。
 結果として、おかしくなります。
 「プロジェクトの設定 → C/C++ → 最適化 → 関数のインライン展開の制御」で「適合可能...続きを読む

QVC6.0 Relese版、Debug版について

VC6.0であるプログラムを作成し、自PCでのRelese版のテストも合格したので、他PCで同じようなテストをしたところ、うまく動作しませんでした。
自PCでは、他PCで発生した不具合がどうしても発生しませんでした。
プログラム事態は、あるファイルからデータを読み込んで保存し、必要なときにそのデータか、0をファイルに出力するというものです。
いろいろ試して原因がわかったのですが、正常に動作するように修正したあと、試しに原因だった箇所を、元の状態に戻して自PCで試したところ、他PCで発生した不具合が再現しました。ちなみに、再現する前までは、Debug版、Relese版の実行ファイルは共に、自PCでは正常に動作していました。

このような現象の原因を知りたいので、心当たりがある方、是非教えてください。

原因だった処理は以下のようなものでした。

FILE* fp;
CString Data;
(省略)
Data.Format("%-10.1lf",0); //←「0」を「0.0」に直すと
              //正常に動作した
if(iRet = fwrite(Data, Data.GetLength(), 1, fp) == 1) {
(省略)
}

VC6.0であるプログラムを作成し、自PCでのRelese版のテストも合格したので、他PCで同じようなテストをしたところ、うまく動作しませんでした。
自PCでは、他PCで発生した不具合がどうしても発生しませんでした。
プログラム事態は、あるファイルからデータを読み込んで保存し、必要なときにそのデータか、0をファイルに出力するというものです。
いろいろ試して原因がわかったのですが、正常に動作するように修正したあと、試しに原因だった箇所を、元の状態に戻して自PCで試したところ、他PCで発生した不具合...続きを読む

Aベストアンサー

可変個引数に値を渡すとき、
0はint型
0.0はdouble型
として関数に渡ります。

VC6.0ということなので、
int型は4バイト
double型は8バイト
の領域を取ります。

書式指定文字列は"%f"なのでdouble型を期待して引数から8バイトの領域をアクセスします。
int型を渡したときは4バイトしか領域がないので後半の4バイトは何に使われているか分からない領域です。
何に使われているか分からない領域なのでたまたま上手く動くときもあるし動かないときもあります。

Qdebug版とrelease版で結果が違う

現在c言語の勉強でシーザー暗号のプログラムを作っているんですが、鍵番号を入力するところで
while(1){
 printf("1から25までの鍵番号を入力して下さい : ");
 scanf("%d", &key);
 while((getchar()) != '\n');
   if(0 < key && key < 26){
     return key;
   }else{
     fprintf(stderr, "\a数字が正しくありません。\n");
   }
debug版では数字以外を入力されたらエラーが出るんですが、
release版ではそのまま進んでしまいます。これはどうしてでしょうか?

環境は win xp sp3 vc++2008EEです。

Aベストアンサー

たとえば, 「scanf の前でたまたま key の値が範囲内」だったとしたら, エラーが出なくても不思議じゃない. つまり, これでは正しくないということ.
デバッグ版だと実際に書いてあるプログラムのほかにもいろいろとやっているので, デバッグ版とリリース版では動作が違う可能性があります.

QSTL使用時のデバッグ設定

現在C++を使いプログラミングをしています
Microsoft Visual Studio 2005を使っているのですが
SLTを使用した場合ランタイムライブラリの設定を
マルチスレッドデバッグ→マルチスレッドに変更すると
エラーが出ることがわかりました。
原因を調べているとSTLを使っているとエラーが出ることまで分かりました。
エラーが出るコードは

#include <stdio.h>
#include <LIST>
using std::list;
int main()
{
list<int> ilist;
ilist.push_back(1);
return 0;
}
warning LNK4098: defaultlib 'LIBCMT' は
他のライブラリの使用と競合しています。/NODEFAULTLIB:library
を使用してください。

の警告と共に、
未解決の外部シンボル~が参照されました。
とエラーがでます

できればMTでコンパイルが通るようにしたいのですが、良い方法ないでしょうか?

現在C++を使いプログラミングをしています
Microsoft Visual Studio 2005を使っているのですが
SLTを使用した場合ランタイムライブラリの設定を
マルチスレッドデバッグ→マルチスレッドに変更すると
エラーが出ることがわかりました。
原因を調べているとSTLを使っているとエラーが出ることまで分かりました。
エラーが出るコードは

#include <stdio.h>
#include <LIST>
using std::list;
int main()
{
list<int> ilist;
ilist.push_back(1);
return 0;
}
warning LNK4098: defaultlib 'LIBCMT'...続きを読む

Aベストアンサー

Debug構成の設定を無理やり デバッグなしの /MTでコンパイルOrリンク使用としているのが要因だと思います

ビルド > 構成マネージャ > アクティブソリューションの構成を
『Debug』から『Release』に変更

Debug時に変更したオプション部分を プロジェクト > プロパティから変更して ビルドしましょう

Debugモードでコンパイルされたソースにはランタイム側にもいろいろとデバッグに必要な関数があります
しかしReleaseモードのランタイムにはデバッグ関連の関数は盛り込まれていません
Release/Debugの設定をよく確かめましょう


人気Q&Aランキング

おすすめ情報