产品代码本身有语法错误
新编写的产品代码,或刚修改过的产品代码,如果存在语法错误,会导致测试代码产生编译错误,测试之前,最好先编译产品代码。
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,请注意,/前面需有一个空格。
其他编译错误
若产品代码可以通过编译,但测试代码产生编译错误,如果问题无法解决或认为可能属于本软件缺陷,请与技术支持联系。
|