加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何避免C-header覆盖本机C类型

发布时间:2020-12-16 07:05:37 所属栏目:百科 来源:网络整理
导读:首先我要解释一下…… 情况 我有这个微控制器代码(普通旧C),其中包含bool.h,内容如下,因为stdbool.h显然不可用,尤其是Visual Studio 2008,这是我目前用于VC和C#的IDE(见下文): #ifndef CUSTOM_BOOL#define CUSTOM_BOOL#ifdef __cplusplusextern "C" {#endif
首先我要解释一下……

情况

>我有这个微控制器代码(普通旧C),其中包含bool.h,内容如下,因为stdbool.h显然不可用,尤其是Visual Studio 2008,这是我目前用于VC和C#的IDE(见下文):

#ifndef CUSTOM_BOOL
#define CUSTOM_BOOL

#ifdef __cplusplus
extern "C" {
#endif // #ifdef __cplusplus

#ifndef bool
#define bool unsigned char
#endif

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

#ifdef __cplusplus
}
#endif // #ifdef __cplusplus

#endif // #ifndef CUSTOM_BOOL

>现在我需要在C#项目中使用该微控制器代码的功能.这就是为什么我创建了一个包含托管类的中间Visual C Project,它包含给定的微控制器代码.
>由于这个包装器项目(VC)摆弄了C代码,它也必须#include“bool.h”(但是间接的方式,这意味着包含另一个头,其本身包括bool.h – 但我认为这是一个不重要的细节).现在这是我的……

问题

由于bool.h包含在VC项目中,并且该项目应提供返回“真实”bool的函数(“real”在这里表示使用VC项目时被C#识别为bool的类型),不幸的是,VC代码中的bool也被预处理器捕获,因此被unsigned char替换.现在发生的事情是,C#最终抱怨不允许从unsigned char转换为bool.这一切都没关系,我理解为什么会这样.所以这是我的……

我怎样才能以“干净”的方式解决这个问题.我目前的解决方案是,在包含bool.h之后,就在VC代码开始之前,我再次定义了bool和朋友:

#ifdef bool
#undef bool
#endif

#ifdef true
#undef true
#endif

#ifdef false
#undef false
#endif

它有效,但它破坏了我正确的编程方式.有没有正确的方法来解决这个问题?或者问题可能发生在之前?我应该改为定义BOOL而不是bool吗?根据我对interwebz的搜索,没有一般的“标准”方法来定义每个人都同意的C项目(不支持C99)中的bool(或BOOL?).

解决方法

所以听起来像微控制器项目只是组成了一个新的数据类型并称之为bool,现在bool是一个关键字(以及true和false),这恰好发生冲突?我的建议(按照优先顺序)是:

解决方案1:修复微控制器项目.
进行全局搜索并替换bool并将其替换为不那么有争议的东西.可能是C_Boolean,C_True和C_False.不太可能导致任何未来的冲突,并且使用正则表达式相当简单.

解决方案2:将微控制器项目转换为C.
这允许直接使用bool,true和false(作为关键字),你可以消除宏.如果微控制器代码使用不兼容的语法,这可能会很困难.

解决方案3:做你已经完成的事情.
创建一个包装器包含,在包含您的微控制器代码后进行清理.我有代码依赖于重新定义extern关键字,这最终成为我唯一安全的方式.它虽然很脆弱……但是当一些不相关的东西破坏了包含结构时,你将来可能不得不修复它.

另外,我不确定原作者认为外部“C”包装器正在做什么,但它们对定义的宏没有影响.也许你删除了一些会产生影响的东西,但宏不受链接器名称约定的影响.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读