2010-01-19 125 views
4

GCC 4.4.2的C89交叉編譯宏名

我有下面的代碼。

#if defined (__linux__) 
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
     strerror(errno), __func__, __LINE__); 

#elif (WIN32) 
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
     strerror(errno), __FUNCTION__, __LINE__); 
#endif 

因爲我在編譯Windows和Linux我不得不分開,因爲它們使用不同的宏用於獲取函數名功能FUNC如上log_msg。

但是,我有很多這些log_msg來寫,只是想知道有無論如何,我可以避免爲了一個宏不同而寫兩次嗎?

非常感謝您的任何建議,

回答

5

爲什麼不做這樣的事情?

#if defined (__linux__) 
    #define FUNC_REF __func__ 
#elif (WIN32) 
    #define FUNC_REF __FUNCTION__ 
#endif 

log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
    strerror(errno), FUNC_REF, __LINE__); 

編輯:你當然可以切忌使用一個新的常數通過定義一個被對方(即#define __func__ __FUNCTION__WIN32條件)

+0

25完全相同的答案糟糕秒。 – 2010-01-19 15:52:06

+0

@克里斯,很好的比賽。 – 2010-01-19 15:53:13

+0

謝謝,如果我在過去的8年中編寫了任何C語言,並且不必查找正確的方式來定義某些內容,我可能會贏。 – 2010-01-19 16:20:07