【发布时间】:2013-08-22 17:17:55
【问题描述】:
首先我要解释一下我的...
情况
-
我有这个微控制器代码(普通的旧 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++ 项目,其中包含包装给定微控制器代码的托管类。
- 由于这个包装器项目 (VC++) 涉及 C 代码,它还必须
#include "bool.h"(但是以间接方式,这意味着包含另一个头文件,它本身包含 bool.h - 但我认为这是一个不重要的细节)。现在这是我的...
问题
由于 bool.h 包含在 VC++ 项目中,并且该项目应提供返回“真实”布尔值的函数(“真实”在这里表示被识别为使用 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.h写得不好。它检查__cplusplus,但仍然无用地定义bool、false和true。我想说#undefs 是最干净的解决方案。 (并且您不需要#ifdefs;如果未定义宏,#undef不会执行任何操作。)
标签: c visual-c++ header boolean c-preprocessor