'true'的多重定义 - 但不是吗?

时间:2012-07-23 11:47:14

标签: c

我有一个双重类型bool所以添加到标题:

typedef double bool;
extern bool true;
extern bool false;

使用:

bool true = 1.0;
bool false = 0.0;

在相应的C文件中。

但是我现在有错误的多个定义为true,并且同样为false,指向C文件中第一个函数的第一行。 “先前声明在这里”的错误指向同一行...它并没有任何区别哪个函数首先放在它总是指向它的文件中。

我的头文件,虽然通过一个公共头文件包含,但确实包含了防护,所以我希望不应该在那里有多个true和false声明。

我已经使用vars tTrue和tFalse将typedef更改为tBool,这解决了问题,但我不知道为什么它首先发生了?由于在代码中仍然存在一些使用true和false的bool类型,因此编译器可能已经有一个true和false的定义作为int已经...但我不认为C做了这个

我使用dev-c ++ 4.9.9.2使用mingw的IDE,虽然我不确定哪个版本是mingw。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

听起来我的参数根本不是Boolean值。您有一个浮点参数,其中包含离散数字0.0和1.0的特殊情况。创建两个double常量而不是类型。

C99添加了_Bool类型的定义, bool true false。尝试在标题中插入以下内容:

#if __bool_true_false_are_defined
# error "stdbool.h has been included"
#endif
#ifdef bool
# error "bool is already DEFINED"
#endif
#ifdef true
# error "true is already DEFINED"
#endif
#ifdef false
# error "false is already DEFINED"
#endif

如果其中任何一个触发,那么你在某处包含 stdbool.h 。您应该能够#undef三个宏,然后安全地设置您的类型。当然,如果其他人希望bool是一个小的整数值并且有更多的风格问题你可以动摇,这可能会破坏。

ISO / IEC 9899:1999确实对许多组在添加到标准之前已经定义了自己的布尔类型这一事实做出了让步。这是将booltruefalse定义为宏而非新关键字的基本原理。但是,明确包含以下警告:

  

7.26.7布尔类型和值<stdbool.h>

     

能够取消定义然后重新定义宏 bool true false 是一个过时的功能。