今、可変長引数をBUFFERにいれて
送る(SSLを使いますが・・・)ことをしていますが、
どうしてもその部分らしいところでwarningがでます。
どうもいまいちva系の取り扱いがわからないので、
アドバイスいただけるとうれしいです。
****ソース(va系が含まれるところのみ)****
WriteToClient (fmt, va_alist)
char *fmt;
va_dcl
{
va_list ap;
char * ssl_buf[1024];
va_start (ap);
vfprintf (stdout, fmt, ap);
va_end (ap);
//SSL
SSL_write(ssl, ssl_buf, sizeof(ssl_buf) );
}
*****コンパイル後のwarningメッセージ****
/usr/local/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/include/stdarg.h:96: warning: `
va_start' redefined
/usr/local/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/include/varargs.h:111: warning:
this is the location of the previous definition
SSLpasschanger.c:216: macro `va_start' used with just one arg
わかる方いらっしゃいましたら、よろしくおねがいいたします。
No.4ベストアンサー
- 回答日時:
ん~つまり WriteToClient 関数を printf のように扱いたいってことですか?
それでしたら、こんな感じだと思います。
void WriteToClient(char* fmt, ...)
{
char ssl_buf[1024];
va_list ap;
va_start(ap, fmt);
vsprintf(ssl_buf, fmt, ap);
SSL_write(ssl, ssl_buf, sizeof(ssl_buf));
}
この書き方で良かったのかどうか忘れてしまいましたが、とりあえず ap には fmt の次の引数のアドレスが入るはずです。
ただ、va_ マクロの実装は処理系によってかなり違うと思いますから、やはり自信は無しです。
呼び出し方は printf と同じです。フォーマットも指定してください。
WriteToClient("%s", "500 Username required.");
// "全角空白" でインデントしてますのでご注意を…もうご存知でしたね。
// No.1 で関数内に書いた ... は "省略" の意味です。なので 214 ... は必要ないです。引数リストの ... は必要です。
// それから gcc には va_alist や va_dcl というマクロもあったのですね。不勉強でした。No.1 の後半部分は忘れてください。
No.3
- 回答日時:
すみません。
書き忘れました。warning メッセージについてですが、stdarg.h と varargs.h で定義が重複しているのではないでしょうか。普通はヘッダファイルの中で二重定義を避けるための記述がされているはずですが、とりあえずインクルードファイルは stdarg.h の方だけで試されてみると良いと思います。
丁寧な説明、ありがとうございます!
すごく感動してます。
warningはきれいに消えました!(T▽T)うれし~♪
お手数ながら、その後のエラーのことも教えていただけないでしょうか?
さっそく一番下に書いていただいたもの(↓)でやってみたのですが、
208 void WriteToClient(char* fmt, va_list va_dcl)
209 {
210 char ssl_buf[1024];
211
212 vsprintf(ssl_buf, fmt, va_dcl);
213 SSL_write(ssl, ssl_buf, sizeof(ssl_buf));
214 ...
215 }
関数を呼び出すとき、引数が少ないというメッセージが帰ってきました。
342:too few arguments to function `WriteToClient'
呼び出すときは、
342 WriteToClient ("500 Username required.");
のように呼び出しているのですが・・・
printfと同じように記述すればよい、と思っていたのですが・・・ちがいますかね?
どうしたらよいでしょうか?
まだプログラミング初心者なもので・・・すいません(^-^;
お願いします。
No.2
- 回答日時:
WriteToClient そのものが、可変引数関数になるのなら、
route156 さんの書かれた、function のように、
void WriteToClient(char *fmt, ...)
とします。まぎらわしいのですが、2つ目の引数はドットを3つ連続で書いてください。
No.1
- 回答日時:
うろ覚えで自信は無いのですが、va_start, va_arg, va_end は可変長引数を一つずつ取り出す場合に使ったと思います。
void function(char* fmt, ...)
{
va_list ap;
int param1;
char* param2;
va_start(ap, fmt);
param1 = va_arg(ap, int);
param2 = va_arg(ap, char*);
...
va_end(ap);
}
ただ、ご質問では vfprintf を使われているようですので、これは引数として va_list をそのまま受け取りますから、va_start 等は必要ないと思います。
void WriteToClient(char* fmt, va_list va_dcl)
{
...
vfprintf(stdout, fmt, va_dcl);
...
}
老婆心ながら WriteToClient の引数を ssl_buf にセットするのでしたら、次のようになるのでは? 他の部分がわからないので推測ですが。
void WriteToClient(char* fmt, va_list va_dcl)
{
char ssl_buf[1024];
vsprintf(ssl_buf, fmt, va_dcl);
SSL_write(ssl, ssl_buf, sizeof(ssl_buf));
...
}
それから、スタック上のバッファを使う時は、オーバーフローに留意された方が良いと思います。
以上、確認はしていないので間違いがあるかもしれません。その点はお許しを。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL PostgreSQL14.6のSSL対応について 1 2023/01/05 15:42
- UNIX・Linux postfix smtpサーバーリレーがTLSハンドシェーク失敗 1 2022/08/15 15:45
- 物理学 高1力学の運動量の問題です。問題を一通り解いたのですが、行き詰まってしまったのでご回答頂ければ嬉しい 3 2022/06/29 11:20
- 電気工事士 【電気】柱状トランス変圧器の疑問です。 質問1 柱状トランス変圧器には+と−と±の記 1 2023/07/02 17:39
- 物理学 2物体の単振動 1 2023/08/17 20:27
- その他(プログラミング・Web制作) mariadbでのエラー 1 2022/11/15 12:31
- スキンケア・エイジングケア グライコクリームとレチノール併用について 1 2023/03/25 21:34
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- 工学 非対称三相交流について 2 2022/07/06 00:36
- 中古パソコン 下のpcどうですか? ノートPC VA-N/15.6型/MS Office H&B 2019/Win 2 2022/07/28 22:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
atoi( ) の反対をやりたい
-
テキストデータをそのままバイ...
-
下記のプログラムがコンパイラ...
-
_TCHAR*での引数の読み込み
-
C言語のfor文です。 繰り返しの...
-
str系関数を使わずに二つの文字...
-
至急!C言語文字列置換
-
C言語の入力した文字を反転させ...
-
型変換
-
charからLPTSTRへの変換方法
-
strlen関数と同じ働きをする関...
-
'const char *' 型は 'char *' ...
-
C言語 ミリ秒を日付に変換には
-
文字列から空白を取り除きたい...
-
C言語 共用体について コマンド...
-
C言語 文字列操作
-
c言語プログラミング実行時エラ...
-
間接参照のレベルが異なっています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報