"Code of the Nerds" Digital Mars C/C++

このエントリーをはてなブックマークに追加
261デフォルトの名無しさん
なんか落ちそうになってきたので思いっきりageで書かせてもらいます(ホシュればよいのかも知らんが)。
dmcだと,コンパイラに-j0オプション指定してもUNICODEの文字列リテラルが直接書けないので,\u使って
文字コードで書かないと通らない。例えば,

 ;;MessageBoxW(NULL, L"こんにちは", L"Title", MB_OK);

なんて書くと,文字化けしてしまう。で,こんなアイデアはどうだろ? 一応動いてる。

> #include <windows.h>
> #include <tchar.h>
> #include <string>
> using namespace std;
> namespace { //無名namespace
> wstring MultiByteToWstr(const char* mbChar, UINT cp) //マルチバイト文字列から変換
> {
> //バッファサイズ取得
> int numChars = ::MultiByteToWideChar(cp, 0, mbChar, -1, NULL, 0);
> wchar_t* pWst = new wchar_t[numChars]; //バッファ確保
>
> //変換
> numChars = ::MultiByteToWideChar(cp, 0, mbChar, -1, pWst, numChars);
> wstring result = wstring(pWst);
> delete[] pWst;
> return result;
> }
> }
>
> #ifdef UNICODE
> #undef _T
> #define _T(str) MultiByteToWstr(str, 932).c_str()
> #endif
こんなヘッダを作っておく(cpは932決め打ちじゃなくてちゃんとやった方がいいけど)。
262デフォルトの名無しさん:2009/09/08(火) 14:03:13
(続き)

で,前述のヘッダを読み込んで,コンパイル時にUNICODEを定義して,

::MessageBoxW(NULL, _T("こんにちは"), _T("Title"), MB_OK);

とやったらちゃんと文字化けせずにメッセージボックスが出た。もちろん,

::MessageBox(NULL, _T("こんにちは"), _T("Title"), MB_OK);

でOK。これだとUNICODEを定義するかしないかでマルチバイト文字とワイド文字が切り替わる。
ただ,dmcと一緒に配布されてるSTLPortが必要だけどね。
263デフォルトの名無しさん:2009/10/03(土) 05:55:46
ひさしぶりに本家サイト見に行ったら
8.51のbetaが配布されてた.

が、そんなことより
C and C++ Compiler Source $49.55
で、コンパイラのソースが売られてることに驚いた。
ライセンス的に自由度はひくそうだけど。
(まあdmdコンパイラのソース公開されていることを思えば
不思議ではないかも)
264デフォルトの名無しさん:2009/11/02(月) 21:07:53
使ったことないのですが、
 Digital Mars C/C++ Compiler
はC++テンプレート周りは強いのでしょうか?
また、S-JISのソースファイルも扱えますか?
265デフォルトの名無しさん:2009/11/02(月) 22:25:37
>264
>  Digital Mars C/C++ Compiler
> はC++テンプレート周りは強いのでしょうか?

Digital Marsのサイトで専用にカスタマイズされたSTLPortがダウンロードできるから
大丈夫だと思うよ。

> また、S-JISのソースファイルも扱えますか?

コンパイラのオプションに -j0 を指定すれば大丈夫。
但しUNICODEの文字列を L"ほげほげ" みたいに書くには、>>261の対策が必要。
マルチバイト文字列リテラルなら問題ないよ。
わかりにくいかも知れないけど、SJISでソースを書いて、

::MessageBoxA(NULL, "ほげほげ", "タイトル", MB_OK);

は大丈夫だけど、

::MessageBoxW(NULL, L"ほげほげ", L"タイトル", MB_OK);

はダメという意味。

コンパイル速くて効率も高いんだけど、最近使ってないなぁ、DMC。
266デフォルトの名無しさん:2009/11/02(月) 22:26:29
>>265
そうですか。
ちょっと試しに使ってこようと思います。
ありがとうございました。