C/C++单元测试工具Visual Unit 4在线帮助


他编译错误

产品代码本身有语法错误
    新编写的产品代码,或刚修改过的产品代码,如果存在语法错误,会导致测试代码产生编译错误,测试之前,最好先编译产品代码。

C语言局部变量在执行语句后定义
如下代码:
int test()
{
    int a = 0;
    a++; //执行语句
    int b = 0; //此行产生编译错误
    //...
    return 0;
}
如果编译器为VC6,会产生如下编译错误:
error C2143: syntax error : missing ';' before 'type'

解决办法:在产品文件中,将执行语句移到变量定义的后面,如下:
int test()
{
    int a = 0;
    int b = 0; //此行产生编译错误
   
a++; //执行语句
    //...
    return 0;
}

在条件中定义变量
如下代码会在while所在行产生编译错误:
int test(int a)
{
    while(int* ptr = getPtr())
    {
        //...
    }
}
原因是VU需对条件插装以监视条件的计算结果,将变量直接在条件中定义会导致插装代码产生编译错误。解决办法:在产品文件中,将变量在判定前声明,如:
int
test(int a)
{
    int* ptr;
    while(ptr = getPtr())
    {
        //...
    }
}

extern "C" 产生的编译错误
    编译错误如:error C2059: syntax error : 'string'
    原因:extern "C"通常用于兼容C++,应和__cplusplus配合使用。
    解决:在产品代码中,将extern "C"{改为:
    #ifdef __cplusplus
    extern "C" {
    #endif

针对函数名的编译开关产生的编译错误
以下代码将产生编译错误,在产品文件中,将{移到#endif后即可解决:
#if defined(__SET_RESET_VECTOR__)
int __interrupt 0 funcname(void) {
#else
int funcname(void) {
#endif

    return 0;
}

原因是:VU会用加工后的函数实现代替原来的实现代码,即{}内的代码会被替换,而#if,#endif等编译开关会在预处理过程中丢弃,导致#endif丢失。解决办法:将{移到#endif后,即:
#if defined(__SET_RESET_VECTOR__)
int __interrupt 0 funcname(void)
#else
int funcname(void)
#endif
{
    return 0;
}

main函数冲突
    一个工程只能有一个main函数,测试工程本身有一个main函数,因此,如果被测试代码中含有main函数,会产生冲突。
   
    推荐的解决办法是:在“工具”菜单,选择“设定”,在“功能”页,选中“转定义main函数”,然后Rebuild All。
   
    在极少数情形下,转定义main函数可能产生编译错误,这时,要取消转定义,并用以下办法之一不测试main函数:
    a.在 工程属性->测试目标,将含有main函数的文件设为X。
    b.在产品代码的main函数前后加上编译条件,语法如下:
    #ifndef _VUNIT
    int main()
    {
        ...
    }
    #endif  


缺少/MD编译开关
    编译错误如:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
    解决:打开工程属性,切换到“编译”页,在命令行中添加:/MD,请注意,/前面需有一个空格。

其他编译错误
    若产品代码可以通过编译,但测试代码产生编译错误,如果问题无法解决或认为可能属于本软件缺陷,请与技术支持联系