无法解码一段代码及其目的

时间:2013-07-26 11:57:34

标签: c

有人能告诉我这段代码在做什么吗?

#ifdef TF_UNIT_TEST
/*lint --emacro( (652), TF_STUB) */

#define TF_STUB(fn) __tf_ ## fn

#else

#define TF_STUB(fn) fn
#endif

3 个答案:

答案 0 :(得分:4)

根据是否定义TF_UNIT_TEST宏来定义具有两个不同名称的函数。

主代码体中的函数将声明为例如

int TF_STUB(my_function) (int a, int b)
{
}

如果宏定义的,那么该函数将被命名为__tf_my_function,如果没有,那么它将被命名为my_function

答案 1 :(得分:2)

其他人已经掌握了技术行为......但在你的问题中,我看到了隐含的“为什么?”。

这看起来像是一个帮助单元测试的技巧。这种情况发生在生产调用功能的环境中,该功能在开发人员完成的单元测试中执行非常难以复制或具有不良副作用的功能。因此,开发人员提供了替代的“安全”功能。

另一个原因是单元测试函数在调用“真实”例程之前会采取其他操作。我想到了额外的数据记录或测试......使单元测试更容易的事情。如果您正在编写一个在本地屏幕上执行复杂操作的图形程序,则在文本文件中记录颜色等比解码实际视频要容易得多。

答案 2 :(得分:1)

它的宏定义

#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
}