私はどの種類のオプションをコンパイルしたかに応じて、さまざまなロギングターゲットに出力する、つまり、int32_t logf(const char *fmt, ...);
という種類のロギングディスパッチャを実装しています。Variadic Loggerディスパッチャ
以下は、抜粋の抜粋です。何もオプションが指定されていない場合
int32_t logf(const char *fmt, ...)
{
va_list va;
i32 res;
va_start(va, fmt);
res = S_PASS;
#ifdef LOG_UART
res = Uart_vprintf(fmt, va);
if (res != S_PASS) goto exit;
#endif /* LOG_UART */
#ifdef LOG_SYS
res = System_vprintf(fmt, va);
if (res != S_PASS) goto exit;
#endif /* LOG_SYS */
exit:
va_end(va);
return res;
}
は今...、ロガーは、ヌル・ロガーこと(そして実際にすることを意図している)でしょう。しかし、そこにはまだva_start()
とva_end()
へのコールが必要ですか?つまり(秒-Wunused-ラベルを無視して)で
、これは正しいです:
int32_t logf(const char *fmt, ...)
{
va_list va;
i32 res;
va_start(va, fmt);
res = S_PASS;
exit:
va_end(va);
return res;
}
...またはこれ?
int32_t logf(const char *fmt, ...)
{
i32 res;
res = S_PASS;
return res;
}
UPDATE
得空関数の実装は、#define logf(fmt, ...) S_PASS;
ような関数形式のマクロに置き換えることができません。
既存のコードベースはtypedef int32_t(*logFunc)(const char *fmt, ...);
と定義されているため、logfへのポインタは格納可能でなければなりません。
空の関数の戻り値と一致するように、variadicマクロは 'S_PASS'に展開する必要があります。 – mch
そうです、それは第2の変種とほとんど同じです。それでも正しいのですか?私は、関数にバリデーショナルなパラメータを宣言し、va_startとva_endを使用しないことができますか? – baeda
@mchはい、あなたは正しいです。それに応じて答えを更新。 –