我已將libiniparser
庫合併到我的Android NDK應用程序中。這個庫的一個問題是直接寫日誌到stdout
/stderr
。C遞歸預處理器定義
我不想大量修改代碼,所以我寫了一個宏登錄logcat
#include <android/log.h>
#define LOG_TAG "libinipaser"
#define fprintf(pipe,...) \
if (pipe == stdout) \
__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__); \
else if (pipe == stderr) \
__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__); \
else \
fprintf(pipe,__VA_ARGS__)
直到最後一刻,我不知道它會工作,但它的作品。我已籤預處理器輸出(GCC-E),它看起來像我預想的上述
fprintf(f, "[%s]=[%s]\n", d->key[i], d->val[i]);
線預處理照顧:
if (f == (&__sF[1])) __android_log_print(ANDROID_LOG_INFO,"libinipaser","[%s]=[%s]\n", d->key[i], d->val[i]); else if (f == (&__sF[2])) __android_log_print(ANDROID_LOG_ERROR,"libinipaser","[%s]=[%s]\n", d->key[i], d->val[i]); else fprintf(f,"[%s]=[%s]\n", d->key[i], d->val[i]);
有人能解釋一下:
- 請問C預支持遞歸宏?
- 它是如何發生的
LOG_TAG
定義被替換,但內部fprintf
不是? - 這個定義會在任何地方工作嗎?
- 這是一個好方法嗎?
這很簡單,C預處理沒有遞歸的宏。 ([Wikipedia reference。](http://en.wikipedia.org/wiki/C_preprocessor#Other_uses)) – 2014-11-25 10:02:01