作者: Bruce.
日時: 2008/12/24(00:30)
Bruce.です。

davi さんは書きました:
> MFCの使用 標準Windowsライブラリを使用する。
> ATLの使用 ATLを使用しない。
> 文字セット マルチバイト文字セットを使用する。
> 
> こんな感じにしました。
> 仰るとおり、「文字セット」のデフォルトがUnicodeになっていました。
> 
> デバッグでのコンパイルで動くのにリリースでコンパイルしないと
> 動かないよぉ、なんで?…とちょっと時間がかかりましたが、
> それぞれ別に指定できるようになっていることに気づいて、解決できました。
> 
> その他は、cppの冒頭に
>   #include "stdafx.h"  // MS Visual C++
> という行があったので、[構成プロパティ]→[全般]→[C/C++]→[詳細]で
> 「c++コードとしてコンパイル(/tp)」を選択。
> 
> 以下、コードの書き換えをした部分。
> 
> ダミーとして新規にプロジェクト作成をすると、雛形が出て来て、
> 見比べると「int _tmain」の書式が違うみたい。
> 古い方をコメントアウトして
> 
> int _tmain(int argc, _TCHAR* argv[])  // _TCHAR*
> {
> 
> に変更。
> 
> あと、intと仮定しましたとかいう、C4430エラーが
>   static rec_level = 1;
> と言う部分で出ましたが、先頭にintを加えて
>   int static rec_level = 1;
> としただけで解決できました。

出自のわからないソースですが、ずいぶんと古いルールを使っているソースですね。
型指定がない場合は int が仮定されるというやつ。

>> このエラーはビルドの結果できた実行ファイルを実行したときのエラーですよね?
>> fopenに渡されてきているパラメーターの問題ではないでしょうか。
> 
> 昨晩のメールのPOST前に確認したんですが、おかしくなさそうだし…と。
> ビルドの文字コードをいじったら、このエラーは消えました。
> 
> 文字コード設定がファイル名を受け取るところで変な動作をしていた、ってこと
> ですかね。

UNICODEビルドされていたなら、たとえば

hoge foo.txt

のように起動したとすると、foo.txt が十六進で表したときに

66 6F 6F 2E 74 78 74

ではなく

66 00 6F 00 6F 00 2E 00 74 00 78 00 74 00

のように 渡されてきているのでしょう。
んで、そんな名前のファイルはないのでオープンに失敗すると(この場合は'f'で
すか)。
#fopenはUNICODEビルドでも変わりませんから

>> いや“warning”ですし、これはとりあえずは放置しても害はないはずです。
> 
>>> #define _CRT_SECURE_NO_WARNINGS
> 
> は外しました。
> 相変わらず「warning C4996: 'fopen'」は出ますけど、ビルドできましたし、
> 実害はないようです。

気になるようなら、そのdefineを再度有効にするか、fopenを
fopen_s に代えてください。引数と戻り値が微妙に異なるので注意が必要です。

> ---------------------
> 今回学んだこと。
> 
> MSのものを使うと、「俺様の世界(MFCとかATLとか)に安住する限りは
> 便利だけど、外の世界では通用しないよ。」という風になるようです。
> ビッグブラザーの世界そのまんま。こわいこわい。

IDEじゃなくてコマンドラインコンパイラでビルドすれば良かったように思いま
すが。
いくらこれまでの経緯があるとはいえ、やることなすこと敵視の源にされる
Microsoftにちょーーーっとだけ同情 :)

-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html