2012-12-24 62 views
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] 

我知道有些人可能不同意這個宏,但這是我必須維護的。

非常感謝任何建議

回答

4

據我所知,你只能串聯常量字符串常量,而不是字符數組,這裏是你的問題:

fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, .... 

fmt是一個字符數組,你需要另一個緩衝區來複制格式,或者您可以分割printf

#define LOG_ERR(fmt, ...)            \ 
    fprintf(stderr, "[ERROR] %s:%d: error [%s] ", __func__, __LINE__, GET_ERROR());\ 
    fprintf(stderr, fmt, ##__VA_ARGS__)