在宏中连接格式化的字符串

时间:2014-08-24 15:52:17

标签: android c macros

我正在android平台上进行一些算法开发。我想修改我过去的开发人员代码并添加关键字,因为他已经在代码中放了这么多有用的日志信息。但我想通过logcat grep一个新关键字来查看我想要的所有有用日志。

1.想法是使用:adb logcat | grep'关键字'查看日志文件。例如,关键字可以是人名詹姆斯。

2.过去的开发人员像这样在头文件中重新编写ALOGE。并在.c文件中添加了许多LOG_ACD。

#define LOG_ACD(fmt, args...) if (acd->stats_debug_mask & STATS_DEBUG_MASK_ACD_LOG) ALOGE(fmt, ##args)

c中的示例是LOG_AcD("%s:acd_enable%d,监视%d,freq%d,afd_state%d,acd_atb%d",      func ,output-> acd_enable,output-> acd_monitor,     output-> freq,output-> acd_state,output-> acd_atb);

3.如何将关键字添加到上面的代码行中以强制.c文件中的每一行LOG_ACD都有我的新关键字?对我来说有趣的部分是ALOGE本身不是字符串,格式字符串将在.c文件中生成。

我希望我能清楚地描述这个问题。谢谢你们

1 个答案:

答案 0 :(得分:0)

您说格式字符串将在C文件中生成。我想你并不是说你说的话。

对于类似printf的函数,通常指定文字格式字符串。 (格式字符串是包含所有格式说明符的字符串,如%d。文字字符串是双引号之间的以零结尾的字符串常量。)如果是这种情况(并且您的示例支持此假设),则可以使用string-literal concatenation:

#define LOG_ACD(fmt, args...) ALOGE("ACD: " fmt, ##args)

两个相邻的字符串文字被编译为一个,例如"A" "B""AB"基本相同。当格式字符串不是文字字符串时,宏将生成编译时错误,但如上所述,这是不寻常的。