【发布时间】:2012-02-23 12:45:06
【问题描述】:
我正在使用 UnitTest++ 框架对我负责的一些 C 代码实施单元测试。最终产品被嵌入并使用 const 结构来保存配置信息。由于目标主机可以异步修改配置,因此结构的成员都是易失的。一些结构也被声明为 volatile。
当我使用 const_cast 尝试修改 UnitTest Windows 7 主机上缺少 volatile 关键字的结构实例时,我遇到了分段错误。这对我来说很有意义。但是,如果结构实例是使用 volatile 关键字声明的,则测试通过。这对我来说没有意义。
这是一个快速的代码示例,显示了 Win7 上 gcc 的问题。切换定义值会导致段错误出现与否,具体取决于是否使用了结构体的 volatile 实例。
typedef struct
{
volatile int foo;
volatile int bar;
} TestStruct;
const TestStruct constStruct = { 1, 2};
volatile const TestStruct volatileConstStruct = { 3, 4};
#define SEG_FAULT 0
int main(void)
{
TestStruct * constPtr = const_cast<TestStruct*>(&constStruct);
TestStruct * constVolPtr = const_cast<TestStruct*>(&volatileConstStruct);
#if(SEG_FAULT == 0)
constVolPtr->foo = 10;
#else
constPtr->foo = 20;
#endif
}
谁能帮我理解为什么 volatile 关键字提供了段错误的解决方法?另外,任何人都可以提出一种方法来允许我修改结构中的值以进行单元测试,而无需将 volatile 关键字添加到所有结构实例中?
编辑:
我刚刚发现你可以在 C 中做到这一点:
#define const
在测试夹具中包含上述有效的“const undefine”可以让我的目标编译器看到 const 关键字并将结构正确地放入闪存中。但是,UnitTest++ 编译器上的预处理器去掉了 const 关键字,所以我的测试夹具能够修改结构。
此解决方案的缺点是我无法添加单元测试来验证函数调用的正确 const 操作。但是,由于从结构实例中删除 const 不是一种选择(需要将数据放在闪存中),这似乎是我必须忍受的一个缺点。
【问题讨论】:
-
您在代码级别混合 C 和 C++,而不仅仅是在接口级别,这可能是个坏主意。这是两种不同的语言。特别是他们对什么是常量和什么是
const限定对象的概念不同。 -
我正在使用需要 C++ 模块的 UnitTest++ 来测试 C 代码。为了示例的目的,我将所有混合的 C/C++ 放入同一个文件中(我无法分享我正在处理的实际代码)。在我的环境中没有混合 C/C++。
标签: c++ c unit-testing constants unittest++