C/C++库创建和调用总结(二)

本文介绍了在使用C++库时遇到的一个编译错误,并提供了两种解决方案:一是更改调用文件扩展名,二是定义bool类型。同时讨论了bool类型替代方案可能导致的问题及规避方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在完成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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值