4

首先我要解释一下我的...

情况

  • 我有这个微控制器代码(普通的旧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?),每个人都会同意。

4

3 回答 3

1

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

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

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

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

另外,我不确定原作者认为 extern "C" 包装器在做什么,但它们对定义的宏没有影响。也许你删掉了一些它会影响的东西,但是宏不受链接器名称约定的影响。

于 2013-08-20T16:03:00.127 回答
0

您可以使用运算符将​​返回值(字符)转换为布尔值。例如,在这种情况下,您可以通过以下方式简单地比较返回值:

bool b = 0 != functionthatreturnsboolean();

请注意,我没有使用 1,因为布尔值的通常定义是 0 表示 false,否则为其他任何值。

另一种解决方案是简单地使用另一种类型的返回值。整数应该很好用。

编辑:根据评论 - 您还可以简单地创建一个调用这些函数并返回 C# 布尔值的接口。

bool interfacefunction()
{
  return function() != 0;
}
于 2013-08-20T15:18:55.347 回答
0

感谢 Keith Thompson(问题下的评论)和 Speed8ump 的回答,我有了另一个想法:

布尔.h:

#ifndef CUSTOM_BOOL
#define CUSTOM_BOOL

#ifndef __cplusplus

#ifndef bool
#define bool unsigned char
#endif

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

#endif // #ifndef __cplusplus
#endif // #ifndef CUSTOM_BOOL

就像一个魅力,我认为它是一个比以前未定义的东西更清洁的解决方案。但是,请随时发表评论或提供更多/更好的答案。

于 2013-08-20T16:24:41.967 回答