Я включил библиотеку 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__)
До последнего момента я не был уверен, что это будет работать, но это работает. Выход я проверил препроцессор (НКА -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
не было? - Будет ли это определять работу везде?
- Это хороший подход вообще или нет?
Это просто, C препроцессор не рекурсивные макросы. ([Ссылка в Википедии.] (Http://en.wikipedia.org/wiki/C_preprocessor#Other_uses)) –