谁能告诉我这段代码在做什么?
#ifdef TF_UNIT_TEST
/*lint --emacro( (652), TF_STUB) */
#define TF_STUB(fn) __tf_ ## fn
#else
#define TF_STUB(fn) fn
#endif
谁能告诉我这段代码在做什么?
#ifdef TF_UNIT_TEST
/*lint --emacro( (652), TF_STUB) */
#define TF_STUB(fn) __tf_ ## fn
#else
#define TF_STUB(fn) fn
#endif
它根据是否定义了TF_UNIT_TEST
宏来定义具有两个不同名称的函数。
主代码体中的函数将被声明为例如
int TF_STUB(my_function) (int a, int b)
{
}
如果定义了宏,则函数将命名为__tf_my_function
,如果没有定义,则将其命名为my_function
。
其他人有技术行为......但在你的问题中,我看到了一个隐含的“为什么?”。
这看起来像是用来帮助进行单元测试的技巧。在开发人员完成的单元测试中,生产调用的功能很难复制或具有不良副作用的环境中会发生这种情况。因此,开发人员提供了替代的“安全”功能。
另一个原因是单元测试函数在调用“真实”例程之前采取了额外的行动。想到额外的数据记录或测试......使单元测试更容易的事情。如果您正在编写一个在本地屏幕上执行复杂操作的图形程序,那么在文本文件中记录颜色等要比解码实际视频容易得多。
它的宏定义在哪里
#ifdef TF_UNIT_TEST //If this macro is defined then define follows
#define TF_STUB(fn) __tf_ ## fn //it defining this macro as _tf_fn (concatinating what ever parameter it has in IF_STUB(fn))
#else
#define TF_STUB(fn) fn //Else it defined as fn
#endif
在程序中它看起来像
#define TF_UNIT_TEST
#ifdef TF_UNIT_TEST
#define TF_STUB(fn) __tf_ ## fn
#else
#define TF_STUB(fn) fn
#endif
int main()
{
TF_STUB(stackoverflow);
}
使用以下编译以查看程序的预处理输出
gcc -E pre1.c
output
1 "pre1.c"
1 "<built-in>"
1 "<command-line>"
1 "pre1.c"
11 "pre1.c"
int main()
{
__tf_stackoverflow; //its appended
}