我已将 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]);
谁能解释一下:
- c-preprocessor 是否支持递归宏?
LOG_TAG
定义被替换但内部fprintf
没有被替换是怎么回事?- 这个定义是否适用于所有地方?
- 这是一个好方法吗?
最佳答案
- 不,c 预处理器不“支持”递归宏,在您的情况下这意味着它完全按照您的意愿行事,而不是递归地扩展宏(永远不会终止)。
- 预处理器不会在当前扩展中扩展之前已经扩展过的标记。
- 我想是的。根据https://gcc.gnu.org/onlinedocs/cpp/Traditional-macros.html ,这种行为似乎是 ISO C 标准的一部分(其中“传统模式”是指在 ISO C89 标准之前使用的模式)。
- 我觉得这很合理。
关于C递归预处理器定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123487/