我試圖將 C 代碼從一個平臺移植到另一個平臺并洗掉依賴項。
有一個除錯函式被呼叫dbg_out,它列印出像printf().
原型是 void dbg_out(int dbgMask, const char *pFormat, ...);
這是一個示例呼叫: dbg_out((5, "SerialDriver : (x-lx) \n", id, sn));
我想將此函式映射到正常printf()呼叫,但有一些問題。
到目前為止我已經嘗試過
void dbg_out (int dbgMask, const char *pFormat, ...)
__attribute__((format(printf, 2, 3)))
;
我需要忽略第一個引數 dbgMask 而只考慮其他引數。
我更喜歡使用前處理器來定義包裝器。我很感激這方面的一些幫助。
uj5u.com熱心網友回復:
您需要使用vprintf,以便能夠使用未知引數
inline void dbg_out (int dbgMask, const char *pFormat, ...) {
va_list ptr;
va_start(ptr, pFormat);
vprintf(pFormat, ptr);
va_end(ptr);
}
uj5u.com熱心網友回復:
使用宏
如果要使用將呼叫更改dbg_out為直接呼叫的printf宏,則可以使用可變引數宏:
#define dbg_out(mask, ...) printf(__VA_ARGS__)
int main() {
dbg_out(1, "%d", 12);
}
如果它們在您的問題中被稱為雙括號(例如dbg_out((5, "%d", 12));
),那么您需要先打開它:
#define EXPAND(mask, ...) (__VA_ARGS__)
#define dbg_out(...) printf EXPAND __VA_ARGS__
int main() {
dbg_out((1, "%d", 12));
}
此外,如果您知道格式始終是字串文字,您還可以將掩碼添加到printf輸出中,例如:
#define dbg_out(mask, format, ...) printf("[Mask:%d]" format, mask, ##__VA_ARGS__)
int main() {
dbg_out(1, "%d", 12);
}
使用雙括號呼叫:
#define EXPAND(mask, format, ...) ("[Mask:%d]" format, mask, ##__VA_ARGS__)
#define dbg_out(...) printf EXPAND __VA_ARGS__
int main() {
dbg_out((1, "%d", 12));
}
使用宏重定向到另一個函式
如果您無法更改 的實作dbg_out,您可以使用宏將呼叫重定向到另一個執行此作業的函式:
#include <stdarg.h>
#define dbg_out(...) dbg_out_new(__VA_ARGS__)
void dbg_out_new(int mask, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
void dbg_out_new(int mask, const char* fmt, ...) {
va_list va;
va_start(va, fmt);
vprintf(fmt, va);
va_end(va);
}
int main() {
dbg_out(1, "%d", 12);
}
如果使用雙括號呼叫,則需要將宏更改為:
#define dbg_out(...) dbg_out_new __VA_ARGS__
/* ... */
int main() {
dbg_out((1, "%d", 12));
}
使用 ,__attribute__(format())您還可以獲得引數的編譯時型別檢查的好處,就像在“使用宏”示例中一樣。
改變功能
如果您可以編輯dbg_out函式實作,則可以將其替換為上述dbg_out_new實作。
However this will not work if it gets called with double parenthesis like you wrote in your question.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341515.html
下一篇:為什么我沒有收到一個“i”變數?
