如何避免C标头覆盖本机C ++类型

美智

首先,我必须解释我的...

情况

  • 我有此微控制器代码(纯老式C),其中包含带有以下内容的bool.h,因为stdbool.h显然不可用,尤其是在Visual Studio 2008上不可用,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 ++项目,其中包含包装了给定微控制器代码的托管类。

  • 由于此包装项目(VC ++)摆弄C代码,因此它也必须#include "bool.h"(以间接方式,这意味着包括另一个标头,其本身包含bool.h-但我认为这是不重要的细节)。现在这是我的...

问题

由于VC ++项目中包含bool.h,因此该项目应提供返回“真实”布尔值的函数(此处的“真实”是指在使用VC ++项目时C#会将其识别为布尔值的类型),不幸的bool是,VC ++代码中的也被预处理器捕获,因此被代替unsigned char现在发生的是,C#最终抱怨不允许从无符号字符到布尔值的转换。没关系,我知道为什么会这样。所以这是我的...

问题

我如何以“干净”的方式解决此问题。我当前的解决方案是,在包含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?)

速8

因此,听起来像微控制器项目刚刚构成了一个新的数据类型,并将其称为bool,由于bool是一个关键字(同时包含true和false),因此碰巧发生冲突了吗?我的建议(按优先顺序排列)将是:

解决方案1:修复微控制器项目。进行全局搜索并替换为bool,然后用争议较少的内容替换。也许是C_Boolean,C_True和C_False。不太可能引起任何将来的冲突,并且使用正则表达式相当简单。

解决方案2:将微控制器项目转换为C ++。这样就可以直接使用bool,true和false(作为关键字),并且您可以消除宏。如果微控制器代码使用与c ++不兼容的语法,则可能会很难做到。

解决方案3:做您已经做的事情。创建一个包装包含,在包含您的微控制器代码后将其清除。我有依赖于重新定义extern关键字的代码,这对我来说是唯一安全的方法。但是它很脆弱...将来,当一些不相关的东西破坏包含结构时,您可能必须修复它。

另外,我不确定原始作者认为extern“ C”包装程序在做什么,但是它们对所定义的宏没有影响。也许您删去了一些会影响的内容,但是这些宏不受链接器名称约定的影响。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章