在完成c++库的创建,和 testdriver.c、testdriver.h两个调用文件的代码后遇到一个问题,花了20多分钟定位!
问题描述:
前提:1.c++库做好,有三个文件:intfTracking.h, LibTracking.lib, LibTracking.dll;
2.test工程中,将库文件准确添加进去;
当编译test工程时,编译报错,错误指向intfTracking.h中一个结构体:
typedef struct
{
int x;
int y;
int s32Width;
int s32Height;
}S_TRACK_RECT;
typedef struct
{
S_TRACK_RECT stTargetRect;
bool bTarget;
}S_DETECT_TARGET;
typedef struct
{
S_DETECT_TARGET astDetectTarget[MAX_TARGET_NUM];
}S_DETECT_RESULT;
指向S_DETECT_RESULT中,错误 3 error C2016: C 要求一个结构或联合至少有一个成员;
解决方法:1.将testdriver.c 改为 testdriver.cpp后,编译通过,正常运行;
2. .c形式下,没有定义bool类型,在intfTracking.h中加入:
#ifndef bool
#define bool int
#endif
重新编译库文件,用testdriver.c进行调用,编译通过,正常运行;
后记: 按第二种解决方法,bool类型实质上是int类型,可能在某些情况下,会发生错误;
比如在判断时:
S_DETECT_RESULT stResult;
//处理代码
if (stResult.astDetectTarget[0].bTarget)
{
printf("%d,%d,%d,%d\n",
stResult.astDetectTarget[0].stTargetRect.x,
stResult.astDetectTarget[0].stTargetRect.y,
stResult.astDetectTarget[0].stTargetRect.s32Width,
stResult.astDetectTarget[0].stTargetRect.s32Height);
}
else
{
printf("NaN,NaN,NaN,NaN,NaN\n");
}
正确情况下,当bTarget = FALSE时,将打印出 NaN,NaN,NaN,NaN,NaN;
但按照第二种解决方法,有时会失效;原因:bTarget = FALSE 时,bTarget获得一个很大或者很小的非正常值,使得if判断偏离预期;
暂以下面方法规避:
//intfTracking.h中加入
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif