我已将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