ATL::CW2A CA2W


<(_ _)>  2013-03-05 11:14:21  No: 73634  IP: 192.*.*.*

例外で落ちるのですが、原因がわかりません。
よろしくお願いします。


WCHAR  wk[32];

例外で落ちます
swprintf_s( wk , _countof(wk) , L"%s%s" ,CA2W("Test1"),CA2W("Test2"));

以下は問題ありません
swprintf_s( wk , _countof(wk) , L"%s%s" ,CA2W("Test1").m_psz,CA2W("Test2").m_psz);
swprintf_s( wk , _countof(wk) , L"%s" ,CA2W("Test1"));
swprintf_s( wk , _countof(wk) , L"%s" ,CA2W("Test2"));

CW2Aでも同じです。

環境はVC2010SP1です。

編集 削除
tetrapod  2013-03-05 18:07:53  No: 73635  IP: 192.*.*.*

CA2W("Test1") はオブジェクトであって wchar_t* ではないから。
sizeof(CA2W) > sizeof(wchar_t*) だから。

もう少し詳しい解説がほしいならそう言ってくれ(今から出かけるので)

編集 削除
Blue  2013-03-06 12:02:48  No: 73636  IP: 192.*.*.*

キャストを入れれば行けんじゃないかしら。
(operator LPWSTRが定義されているから)

編集 削除
tetrapod  2013-03-08 18:17:20  No: 73637  IP: 192.*.*.*

納得できたのだろうか・・・とりあえず第三者読者のために追記

以下の3つはプログラムとして誤っている。
> swprintf_s( wk , _countof(wk) , L"%s%s" ,CA2W("Test1"),CA2W("Test2"));
> swprintf_s( wk , _countof(wk) , L"%s" ,CA2W("Test1"));
> swprintf_s( wk , _countof(wk) , L"%s" ,CA2W("Test2"));

printf 系関数の %s は、対応する引数が const char* (const wchar_t*) であるときだけ有効。
であるにもかかわらずこの例では CA2W() オブジェクトを渡しているので、
フォーマット文字と引数が不一致である=誤り。
下2つはたまたま正しく動作しているように見えるが、ちょっと書き直すと誤動作する。
swprintf_s( wk , _countof(wk) , L"%s%d" ,CA2W("Test1"), 123);

以下の1つは正しく (const) wchar_t* を渡しているので期待通りの結果が得られる。
> swprintf_s( wk , _countof(wk) , L"%s%s" ,CA2W("Test1").m_psz,CA2W("Test2").m_psz);

%s が const wchar_t* を要求するからといって、
可変個数引数部で行われる型昇格にそういう変換は含まれないので
キャストを明記していない限り operator LPWSTR は起動されない。

あと重箱の隅っぽいが、そもそも可変個数引数部に non-POD オブジェクトを渡すことはできない。

MSDN の説明もあまりよくない (英語版もダメ)
http://msdn.microsoft.com/ja-jp/library/hf4y5e3w(v=vs.80).aspx
String ってオレオレ用語は何だよ? const char* の誤りだ。

http://msdn.microsoft.com/ja-jp/library/3fycdw4d(v=vs.80).aspx
m_psz は「元の文字列」ぢゃない(はずだ)

編集 削除