可変長引数の関数について – プログラミング – Home

可変長引数の関数について
 
通知
すべてクリア

[解決済] 可変長引数の関数について


たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

可変長引数の関数の作ろうと以下のコーディングを行ったのですが結果は、va_argsで死んでし
まいます。
可変長部は、0~3個のCStringを予定しています。

CString CXXX::Test(CString str, int length, ...) {

va_list args;
va_start(args, length);

CString param1, param2, param3;

if (length > 0) {
param1 = va_arg(args, CString);
}
if (length > 1) {
param2 = va_arg(args, CString);
}
if (length > 2) {
param3 = va_arg(args, CString);
}
~略
}

Test(str, 3, aa, bb, cc);


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

CXXX::Test ってことはこの関数はクラスのメンバ(thiscall)ですか?
基本的にva_args は cdecl 型の関数でないと使えなかったと思います。

# 気になって見てみたけど、CString::Format @ atlstr.h も中は
# __cdecl になってました。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

訂正
CString::Format @ cstringt.h


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

ためしに、CXXX::Testに、__cdeclをつけてみたのですが
va_argで死ぬのは変わりませんでした。
何か、__cdeclを指定する場合の注意事項等ありますでしょうか。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

> Test(str, 3, aa, bb, cc);
可変個引数の関数に CString を渡したいのであればこれはダメです。
最初の str は原型宣言により暗黙の変換が行われますが、
可変個引数部分においては暗黙の変換は行われません。

Test(CString(str), 3, CString(aa), CString(bb), CString(cc));
と呼び出したらどうなるでしょうか?

ないしは CXX::Test() のほうで受け取る可変個引数部分を const char * にするか。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

代案
この例では引数の数は最大で3つ、ということになる訳でしょうか?
4つ以上を指定するとエラーになって欲しい、とか?
それならば単純にデフォルト引数を指定するのが簡単。

class CXX { ...
CString Test(CString s, const TCHAR* arg1=0, const TCHAR* arg2=0, const TCHAR*
arg3=0);
};
CString CXX::Test(CString s, const TCHAR* arg1, const TCHAR* arg2, const TCHAR*
arg3) { ... }
const TCHAR* より CString のほうがお好みならそちらでも可。
これなら可変個引数のようにも使えるけど、暗黙の変換が使えるので簡単。


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

>Test(CString(str), 3, CString(aa), CString(bb), CString(cc));
>と呼び出したらどうなるでしょうか?
と呼び出したらできました。暗黙の変換が原因だったんですね。

また、デフォルト引数を使う案ですがもちろんできました。
(というか、全然この案思いつかなかったです~)

デフォルト引数を使う案の方が、引数の数必要ないし、CString(aa)とか書かなくて良いし
こちらを採用することにしました。

わざわざ、代案までありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました