个人定义FALSE和TRUE是个坏主意?为什么?

Zeb*_*ish -1 c++ boolean

我听过多次提到自己定义这些宏是一个坏主意,但我不明白为什么.显然,'false'和'true'是C++标准的一部分,'FALSE'和'TRUE'不是标准的一部分.

但是,'FALSE'和'TRUE'被定义为windows.h中的宏,我已经习惯了它,并且实际上更喜欢它们,因为它们提醒我,在剥离任何抽象之后,布尔值被简单地评估为位级的整数.无论如何,这是个人偏好,但我想知道如果我想在我的程序中定义自己的宏真的是一个坏主意吗?任何有说服力的理由为什么不应该这样做?

我在Stack Overflow上看到的一个答案是,该人已经看到心怀不满的员工通过代码并插入如下内容:

#define FALSE 1
Run Code Online (Sandbox Code Playgroud)

但除了极其遥远和愚蠢的东西之外,还有什么好的理由不去吗?

编辑:谢谢你的回答.我理解并同意的理由是:(来自Ulrich Eckhardt)

  • 每个人都知道存在常量/关键字true和false.
  • 它与win32 API中的宏冲突,因此您的代码将无法移植到该平台.
  • int const FALSE = 1; 没有宏观副作用会达到同样的效果.

(来自Paul Evans)

  • "你当然不希望它们为0和1,这会搞乱调用函数重载bool和int的事情."
  • "因为如果可能的话,最好避免使用宏.预编译器只需在编译器查看之前用文本替换所有宏.所以你会丢失它们作为信息来源,比如说,调试等等."
  • 将它们定义为常量表达式并避免使用宏

谢谢.

Ulr*_*rdt 5

一堆原因:

  • FALSE需要再输入一次按键false.
  • 宏是邪恶的.
  • int const FALSE = 1; 没有宏观副作用会达到同样的效果.
  • 它仍然看起来像一个宏.
  • 有现有的常量/关键字truefalse每个人都知道.
  • 如果您和唯一一个曾经在该代码库上工作过的人,那么它就变得足够清晰了.
  • 它与win32 API中的宏冲突,因此您的代码将无法移植到该平台.
  • A bool不是int.