我正在實現一種記錄調度器,即int32_t logf(const char *fmt, ...);
,它根據編譯的選項輸出到不同的記錄目標。可變參數記錄器調度器
以下是一段簡短的摘錄。
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的指針必須是可存儲的。
可變宏應擴展爲'S_PASS'以匹配空函數的返回值。 – mch
是的,這大部分與第二個變體相同。但是,這是正確的嗎?我可以只向函數聲明可變參數,不要使用va_start和va_end? – baeda
@mch是的你是對的。相應地更新答案。 –