如何避免C-header覆盖本机C类型
首先我要解释一下……
情况 >我有这个微控制器代码(普通旧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,它包含给定的微控制器代码. 问题 由于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:修复微控制器项目. 解决方案2:将微控制器项目转换为C. 解决方案3:做你已经完成的事情. 另外,我不确定原作者认为外部“C”包装器正在做什么,但它们对定义的宏没有影响.也许你删除了一些会产生影响的东西,但宏不受链接器名称约定的影响. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |