C 告诉VX的任务是;“bool”;以布尔形式?

C 告诉VX的任务是;“bool”;以布尔形式?,c,eclipse,misra,C,Eclipse,Misra,我正在使用VX任务处理工具集(基于Eclipse构建),有一个相当基本但基本的问题,我无法解决。。。我已经完蛋了,但还是一点也不聪明 想象一下简单的代码片段: #include <stdbool.h> bool myFlag = false; Eclipse被设置为C99实现,根据,stdbool.h被定义为: #define bool _Bool #define true 1 #define false 0 我假设这个错误是因为#define false 0并且该工具正在

我正在使用VX任务处理工具集(基于Eclipse构建),有一个相当基本但基本的问题,我无法解决。。。我已经完蛋了,但还是一点也不聪明

想象一下简单的代码片段:

#include <stdbool.h>

bool myFlag = false;
Eclipse被设置为C99实现,根据,
stdbool.h
被定义为:

#define bool  _Bool
#define true  1
#define false 0
我假设这个错误是因为
#define false 0
并且该工具正在隐式转换为bool

注意:如果我强制转换分配,则错误将被删除:

 bool myFlag = (bool)false;
但是(IMHO)这是在掩盖问题,而不是解决问题,我真的不想把每一个任务都交给别人

诸如LINT之类的工具允许您指定bool类型以阻止此类误报。。。我需要Eclipse/任务处理的等效工具


所以我的问题是:

我怀疑某个地方有一个工具选项可以告诉任务处理
bool
是布尔类型,因此
false
true
可以使用吗?

有吗

{请不要[在这个帖子上]讨论MISRA的优点}

MISRA规则10.1说

(规则10.1)整数类型表达式的值不得隐式转换为不同的基础类型,如果:

a) 它不是到具有相同符号的更宽整数类型的转换,或

b) 表达式很复杂,或者

c) 表达式不是常量,是函数参数,或

d) 表达式不是常量,是返回表达式

0
的类型为
int
,它是有符号整数类型,但
\u Bool
是无符号整数类型。 将有符号类型的值隐式转换为无符号类型的值,依此类推 您违反了MISRA规则10.1中的
a)

请注意,如果您使用的是MISRA-C:2004(我不认为MISRA-C:2012已经发布),那么在发布时,只考虑了C90,并且
\u Bool
是C99的补充。正如我在评论中所写的那样,您可以使用如下方式消除警告:

bool myFlag = (bool) false;

这就是米斯拉之美。

似乎没有办法绕过它,但你可以这样定义布尔:

typedef enum _bool { false = 0, true = 1 } bool;
bool x = false;
这应该通过严格的检查。

你可以
#undef
true
false
#include
之后,将它们定义为新的值,让MISRA的员工满意


C99和C11允许这种做法作为一种过时的功能。

您是否收到带有
bool myFlag=(bool)false的警告?否。。。这就是我的假设。但我真的不想让每一个bool集合或测试都被一个cast搞得乱七八糟。最好的办法可能是
#定义真正的1u
等等,但随后需要重写代码,以便在任何地方都使用大写版本。问题的根源在于您使用的是C99,而MISRA-C:2004不允许也不支持C99。@lundin-在某种程度上您是正确的,但是(我必须检查)即使在MISRA-C:2012中,这也可能是一个问题(布尔设置为无符号整数)由于stdbool.h定义bool类型的方式有缺陷…@Andrew如果MISRA-C:2012的最终版本与草案类似,那么他们将更改表达式中类型的定义。他们计划引入一种称为“基本类型”的东西,而不是旧的术语“基本类型”。布尔表达式将具有“基本布尔”类型,静态分析器必须正确处理它们。MISRA甚至指出,C90中的“布尔枚举”应该被视为基本布尔值。当然,这只是目前的草案。看起来MISRA-C:2012将比2004年更好、更平滑地处理隐式类型转换。当然,这也是C语言应该做的!然后,您还必须删除
stdbool.h
头,这样您就不会有与
\u Bool
相同的行为(例如,对于通常的算术转换)。枚举本身有很多符号问题,它们非常奇怪,以至于枚举变量和枚举常量不一定具有相同的符号和宽度。相反,请使用#defines and write
0u
1u
来代替。调用枚举类型
bool
会导致混淆,因为现在有两种类型名为
bool
,它们的行为略有不同,(在许多系统上)大小不同(通常,
sizeof(\u bool)
为1,
sizeof(enum\bool)
为4).不,MISRA-C:2012尚未发布(很快…)。这不是一个好主意,因为MISRA-C 19.6禁止未定义,20.1禁止重新定义标准库中的项目。
_Bool myFlag = 0;
bool myFlag = (bool) false;
typedef enum _bool { false = 0, true = 1 } bool;
bool x = false;