我已将libiniparser
库合并到我的Android NDK应用程序中。此库写入的一个问题是直接记录到stdout
/ stderr
。
我不想大量修改代码,所以我写了一个宏来登录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]);
有人可以解释一下:
LOG_TAG
定义被替换但内部fprintf
未被替换,该怎么回事?答案 0 :(得分:5)
答案 1 :(得分:2)
我只回答问题4。 mstorsjo的其余部分几乎都是录音。
没有。这不是一个好主意。宏魔术通常不鼓励在另一种“正确”的方式来实现结果 - 可能是常数或函数(如本例所示)。
在这种情况下,似乎是对fprintf
的调用(通常)返回int
(字符输出的数量)将不会评估。例如,int count=fprintf(file,"Hello");
将是编译错误。
对您来说这可能不是问题,但考虑到一般情况,任何在翻译单元中包含该宏定义的任何代码的人可能只是让他们的代码被破坏并且有一个Dickens找到工作的原因然后需要#undefine
宏来获取他们的代码!
马科斯并不差。它们肯定在条件编译和调试中占有一席之地。我个人在Java中为此目的而想念他们。
但是,作为一般规则,如果有另一种语言构造来做同样的事情 - 使用它。
在这里讨论宏的优点和缺点有一些很好的答案:
Why are preprocessor macros evil and what are the alternatives?