首先我要解释一下我的...
情况
我有这个微控制器代码(普通的旧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# Project中使用该微控制器代码的功能。这就是为什么我创建了一个中间Visual C++ 项目,其中包含包装给定微控制器代码的托管类。
- 由于这个包装器项目 (VC++) 涉及 C 代码,因此它也必须
#include "bool.h"
(但是以间接方式,这意味着包含另一个头文件,它本身包含 bool.h - 但我认为这是一个不重要的细节)。现在这是我的...
问题
由于bool.h包含在 VC++ 项目中,并且该项目应提供返回“真实”布尔值的函数(“真实”在这里表示在使用 VC++ 项目时被 C# 识别为布尔值的类型),不幸的bool
是,VC++ 代码中的 也被预处理器捕获,因此被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?),每个人都会同意。