2012-03-16 100 views
0

我有什麼感覺像一個簡單的問題,但我似乎無法弄清楚如何解決它。我有一個我正在移植到Android的大型應用程序。該代碼與許多日誌調用散落,看起來像下面這樣:重新定義記錄的宏

LOG_WARN(s_debugHandle, ("OpenGL error detected on entry. (Error:0x%x).",glError)); 

我要重新定義LOG_WARN是combatible與Android。我所做的是這樣的:

#define LOG_WARN(handle, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) 

當我編譯該編譯器告訴我:

error: invalid conversion from 'int' to 'const char*' 
error: initializing argument 3 of 'int __android_log_print(int, const char*, const char*, ...)' 

glError是一個int,但其他調用與其他變量類型給予同樣的轉換錯誤而是來自那種類型。我曾嘗試:

  1. 交換...和VA_ARGS只是 「味精」。同樣的問題。
  2. 刪除LOG_WARN第二個參數的圓括號。這實際上解決了這個問題,但在我的情況下這不是一個有效的解決方案,因爲這會破壞其他平臺的日誌記錄宏。
  3. 1和2 - 抱怨太多爭論。

請幫忙!

UPDATE:

預處理後,調用如下:

__android_log_print(ANDROID_LOG_WARN, "debug", ("OpenGL error detected on entry. (Error:0x%x).",glError)); 
+0

你可以檢查預處理器的輸出,看看你是否需要這個? – 2012-03-16 14:38:06

+0

完成並更新了問題。 – Jake 2012-03-16 14:48:40

+0

可以刪除括號並更改其他平臺的宏嗎? – Kevin 2012-03-16 14:49:19

回答

1

你可以安裝你自己的,中間的功能,使用打印的原始的可變參數版本:

#include <cstdarg> 

void forward_debug(const char * fmt, ...) 
{ 
    std::va_list ap; 
    va_start(ap, fmt); 
    __android_log_vprint(ANDROID_LOG_WARN, LOG_TAG, fmt, ap); 
    va_end(ap); 
} 

#define LOG_WARN(ignore, x) forward_debug x 

更新:這是另一個想法:

#define SPLIT(...) __VA_ARGS__ 
#define LOG_WARN(ignore, x) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, SPLIT x) 
+0

燦爛!這很好。謝謝老兄:-) – Jake 2012-03-16 15:43:23

+0

我會在下週嘗試一下你的更新,如果它有效的話,那肯定是更好的解決方案。 – Jake 2012-03-16 16:02:21