3
GCC 4.7.2 C89編譯錯誤與函數宏
你好,
我工作的一些修的,我有以下函數宏:
#define GET_ERROR() ((errno == 0) ? "None" : strerror(errno))
#define LOG_ERR(fmt, ...) \
fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, __LINE__, GET_ERROR(), ##__VA_ARGS__)
#define LOG_ASSERT(ARG, fmt, ...) do { \
if(!(ARG)) { \
char arg_fmt[512]; \
snprintf(arg_fmt, sizeof arg_fmt, "%s, ", #ARG); \
strcat(arg_fmt, fmt); \
LOG_ERR(arg_fmt, ##__VA_ARGS__); \
errno = 0; \
abort(); \
} \
} while(0)
的LOG_ASSERT將模擬一個斷言函數。但會包含來自strerror errno的一些額外信息。
裏面我是用這樣的:
LOG_ASSERT(msg_id != -1, "Failed to connect to the message queue [ %d ]", msg_id);
所以應該顯示如下:
"msg_id != -1, Failed to connect to the message queue [ -1 ]"
我見 「!MSG_ID = -1」 的FMT的開始使用前綴strcat的。
但是,我得到這些編譯錯誤,我似乎無法修復。我認爲這很簡單,如果我缺少一些簡單的東西,只想得到另一個想法。
error: expected ‘)’ before ‘arg_fmt’
warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat]
warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat]
我知道有些人可能不同意這個宏,但這是我必須維護的。
非常感謝任何建議