如何为各.cpp文件配置带专属TAG的__android_log_print日志宏以避免重复代码
实现方案
核心思路是拆分公共依赖与专属TAG的定义时机,利用C/C++宏的编译作用域规则,既消除重复代码,又完全符合现有约束。
1. 新建公共日志宏头文件 alog_common.h
将所有通用的依赖、宏定义收敛到这个公共头中,不写死任何特定TAG,内容如下:
// 头文件保护,避免同一编译单元内重复包含 #ifndef ALOG_COMMON_H #define ALOG_COMMON_H // 仅包含日志功能必需的系统依赖,日志宏本身不需要jni.h,用到JNI逻辑的文件自行引入即可 #include <android/log.h> // 兜底默认TAG,防止业务文件漏定义TAG导致编译报错 #ifndef TAG #define TAG "NDKDefault" #endif // 优化后的ALOG宏,默认使用当前文件提前定义的专属TAG,无需每次手动传参 #define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, ##__VA_ARGS__) #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, ##__VA_ARGS__) #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, ##__VA_ARGS__) #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, ##__VA_ARGS__) #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, ##__VA_ARGS__) #endif // ALOG_COMMON_H
2. 业务.cpp文件的使用规则
每个需要打印日志的业务文件,只需按以下顺序写3行配置代码,完全无需重复粘贴整段宏定义:
// 必须先定义当前文件的专属TAG,再包含公共日志头,完全符合「不能在引入公共头后重定义TAG」的约束 #define TAG "RecordingSwitcher" // 此处替换为每个文件自己的专属标识 // 引入公共日志头 #include "alog_common.h" // 如文件需要使用JNI逻辑,再单独引入jni.h即可,与日志逻辑完全解耦 #include <jni.h>
3. 实际日志调用示例
配置完成后,直接调用宏即可,无需手动传TAG参数:
// 直接打印当前TAG的日志 ALOGD("录屏切换触发,当前状态:%d", state); ALOGE("初始化编码器失败,错误码:%d", errCode);
若需临时打印其他TAG的日志,可在公共头中扩展独立的带参宏(如
ALOG_D_TAG(customTag, ...)),与默认宏共存,不会影响现有逻辑。
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

