包含.c文件的副作用

时间:2017-11-24 09:33:18

标签: c embedded

免责声明:我知道此处已经提出类似的问题,但没有人回答我的问题。

使用的编译器:XC32 v1.44(基于gcc) 环境:嵌入式(我也在使用FreeRTOS,但这不重要吗?)

对于我的项目,我想要一个高测试代码覆盖率。我的接口非常流畅,我有很多(私有)静态函数,我想单独测试。所以,在我的测试文件中,我已经包含了c文件。现在我可以访问静态函数,一切都会好的。只有它不是。

我必须指出,我没有从项目中排除c文件。所以代码很可能被编译两次,一次作为单个c文件,一次包含在测试文件中。

我没有得到任何编译或链接器错误(我在其他问题中读到了我应该这样做)。代码运行正常 - 主要是。

代码也可以访问两次,一次是通过测试,一次是通过仍然在后台运行的常规状态机。

我觉得现在看起来一切都重复了。因此,所有静态变量都创建了两次,常规状态机访问的是与测试不同的静态变量。

示例:

static int myInt = 0; // lets assume this would be possible in c...
static void Increment()
{
    ++myInt;
}
static int getIncrement()
{
    return myInt;
}

因此,当状态机调用Increment()并且测试调用getIncrement()时,测试仍然为0。

这是否比我想的更正确或更复杂?我目前的效果是我在我的测试中调用了一个函数(来自包含的c文件),它打开一个处理程序(处理程序存储在静态中)但是调用(在我的测试中)到第二个使用的函数那个处理程序声称仍然是NULL ...这种行为不符合我上面的解释...

2 个答案:

答案 0 :(得分:0)

一种可能性是您的测试作为单独的进程运行,而常规状态机作为单独的进程运行。请确认由于单独的入口点而创建了不同的进程。您可以在运行测试时检查创建的进程数。

您可以创建一个全局mutux变量来验证两者是否全局使用相同的变量。这需要在应用程序开始时创建,并且需要添加检查以验证其创建以进一步执行代码。

答案 1 :(得分:0)

如果你有一个带有静态变量的C文件 - 在这种情况下你的计数器 - 并且这个文件包含在不同的文件中,那么这些静态变量将被复制到C文件所在的每个文件上包含在此C文件本身中。如您所知,静态全局变量仅在其定义的文件中已知,因此您现在拥有许多具有相同名称的不同静态变量。

您只需要将计数器定义为一个,并在所有其他文件中将其外部。

因此,简而言之,您正在递增并读取两个具有相同名称的不同变量。