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と関連する良く見られている質問

QC++ 文字列とポインタ、STL::mapについて

C++でポインタと文字列の受け渡しについて質問です。
MyData::search()は文字列を受け取ってメンバ変数 dict内の ヒットしたデータの
グループ(文字列)を返すメンバ関数です。
メンバ変数 dict はSTLのmapを使っています。

void MyData::search( const char* funcbox, const char* result ){
for ( map<const char*, const char*>::iterator itr = dict.begin(); itr != dict.end(); ++itr ){
const char* a_name = itr->first;
const char* a_group = itr->second;
if ( strstr( a_name, funcbox) ){
result = a_group;
return;
}
}
result = NULL;
}




MyData::dict["yamada"] = "groupA";

const char* res = NULL;
MyData::search("yamada", res);
cout << " group = " << res << endl;


上のようにアクセスするとメンバ関数内では res == "groupA" となりますが、
関数から出るとresはNULLになってしまいます。

res に関数を抜けた後も消えないアドレスを渡すにはどうすればよいでしょうか?

C++でポインタと文字列の受け渡しについて質問です。
MyData::search()は文字列を受け取ってメンバ変数 dict内の ヒットしたデータの
グループ(文字列)を返すメンバ関数です。
メンバ変数 dict はSTLのmapを使っています。

void MyData::search( const char* funcbox, const char* result ){
for ( map<const char*, const char*>::iterator itr = dict.begin(); itr != dict.end(); ++itr ){
const char* a_name = itr->first;
const char* a_group = itr->second;
if ( strstr( a_name, fun...続きを読む

Aベストアンサー

僕ならこうする。

#include <iostream>
#include <map>
#include <string>

class MyData {
std::map<std::string,std::string> dict;
public:
void add(const std::string& key, const std::string& value) {
dict[key] = value;
}
bool search(const std::string& key, std::string& value) const {
std::map<std::string,std::string>::const_iterator iter
= dict.find(key);
if ( iter == dict.end() ) {
return false;
}
value = iter->second;
return true;
}
};

using namespace std;

int main() {
MyData data;
data.add("apple","りんご");
data.add("orange", "みかん");
string value;
string key;
key = "apple";
cout << key << ':' << (data.search(key,value) ? value : "not found") << endl;
key = "peach";
cout << key << ':' << (data.search(key,value) ? value : "not found") << endl;
}

僕ならこうする。

#include <iostream>
#include <map>
#include <string>

class MyData {
std::map<std::string,std::string> dict;
public:
void add(const std::string& key, const std::string& value) {
dict[key] = value;
}
bool search(const std::string& key, std::string& value) const {
std::map<std::string,std::string>::const_iterator iter
= dict.find(key);
if ( iter == dict.end() ) {
return false;
}
value = iter->second;
return true;
...続きを読む

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になる可能性が高く、リリースモードの場合は、不定(前回のスタック領域で使用された値)になります。

QC++でSTLを使ったときのデバッグ方法

STLを使ったときの効率の良いデバッグ方法を教えてください.

STL使ったときのエラーメッセージが,何を言わんとしているのかが
さっぱり分かりません.
STLのソースをテンプレートで読み込んでるせいで,
STLのソースに依存してるかのような非常に長くて分けのわからん
エラーメッセージが出るのです.
このような場合に,エラーの真の原因(どう考えても,テンプレートではなく,
私の未熟なSTLへの理解が原因でしょう)を突き止める方法はどのようなものが
あるのでしょうか?

教えてください.

Aベストアンサー

こんにちは。

確かに長くてわけのわからんメッセージが出てきてつらいですよね。
「Effective STL」という本に書いてあった方法ですが、
例えばstd::string型の場合、
std::basic_string<char,std::char_traits<char>,std::allocator<char> >
のように表示されてしまうので(VC++6.0)、これをstringに置換してしまう、というのがありました。
こういう方法だとメッセージがだいぶ短くなって少し読みやすくなるのではないでしょうか。

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++ → 最適化 → 関数のインライン展開の制御」で「適合可能...続きを読む

QATLとSTLの違いは何でしょうか?

ATLとSTLの違いは何でしょうか?
STLでもリスト構造(線形リスト、[双方向リスト])
#include <list>があるみたいですが・・・
STLはC++の標準テンプレートライブラリ(そのまま)と理解しています。

あと、ActiveXとALTの違いも知りたいです。
極論しますが、ActiveXとはOCXを作ることでしょうか?

Aベストアンサー

ざっくりとですが

ATL(Active Template Library)=ActiveXを作成するためのライブラリ
STL(Standard Template Library)=C++言語におけるOS依存しない標準ライブラリ


>極論しますが、ActiveXとはOCXを作ることでしょうか?
はいその通りです。
WIndowsのコンポーネント技術が
VBX→OCX→ActiveX という順に進化したので、事実上同じです。

従来のOCXはローカル環境のみだったのが、
WEB対応してActiveXと名称を変えました。

このActiveX(OCX)を作成するときにMFCかATLを使います。
ATLの方がActiveXのために作られた特化したライブラリです。


リスト構造とかは汎用クラス群として、様々なライブラリに含まれているのだと思います。
MFCにもリストはあります。

その汎用クラス群のみについて、個々のライブラリがバラバラに持つのではなく、
統一化しようとして作られたのがSTLです。

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バイトは何に使われているか分からない領域です。
何に使われているか分からない領域なのでたまたま上手く動くときもあるし動かないときもあります。

QSTL形式のヘッダ情報

STL形式のフォーマットについての質問です。
STLローダをプログラミング中なのですが、バイナリ形式か、テキスト形式かの判別方法で悩んでいます。この情報はヘッダの情報から読み取れるのでしょうか?どのようにして判別可能でしょうか?それともファイル内容自体から、判別する必要があるのでしょうか?

よろしくお願いします。

Aベストアンサー

拡張子".STL"は他の種類のファイルでも使われているので
最終的にはファイル内容から判断するしかありませんが
テキスト形式の場合頭は[solid]と決まっています。
バイナリ形式の場合の頭は任意となってますのが
ヘッダに書かれているパッチ数をnとすると
ファイルサイズは50*n+84バイトです。

自分なら・・・ですが
(ファイルサイズ-84)/50で余りがなく
 パッチ数を読み込んで計算が合えばバイナリ形式
その他の場合、最初の5charが[solid]ならテキスト形式
さらにその他の場合、拡張子が".STL"なだけのファイル
と判断します。

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 > generic algorithms

STL (Standard Template Library)の日本語の説明においてよく
- コンテナ
- イテレータ
- アルゴリズム
があるとの説明があります。
(例えば http://homepage2.nifty.com/well/STL.html#ALGORITHM )

洋書のSTLの本を読むと"generic algorithm"という用語が出てきました。

日本語説明の「アルゴリズム」と洋書の"generic algorithm"とは同義なのでしょうか?

あるいは、アルゴリズムの中の細分類としてgeneric algorithmがあるのでしょうか? 細分類としてある場合は、generic algorithm以外にどういうalgorithmがあるのかを知りたいと思います。

Aベストアンサー

STLでのアルゴリズムは,一般に言うアルゴリズムの一部です。
STLでのアルゴリズムは,例えば
http://msdn.microsoft.com/ja-jp/library/yah1y2x8.aspx
ここに一覧があります。

generic algorithmとは,一般に言うアルゴリズムのひとつの例です。
しかし,STLでのアルゴリズムには含まれていません。

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ランキング