【问题标题】:Defining names in place of "true" and "false" for bool type为 bool 类型定义名称来代替“true”和“false”
【发布时间】:2011-01-07 02:01:51
【问题描述】:

我想使用bool 在加载 X 和从文件加载 Y 之间来回切换。我不想使用“true”和“false”,因为它不会使代码清晰。我宁愿使用像 LOAD_X 或 LOAD_Y 之类的东西......下面的代码是这样做的吗?还是有更好的办法?

#define LOAD_X true
#define LOAD_Y false

编辑:好的,看来enum 是要走的路……但是命名方案应该是什么?就像所有大写字母一样,或者第一个单词小写,后面单词大写等等。

【问题讨论】:

  • 等到有人过来写if(LOAD_Y)...
  • @Anon 为什么会有人这样做?
  • @Tomalak:可能与任何人都会泄漏内存或双重释放某些东西的原因相同。让它很容易搞砸(并且让它在搞砸时实际上看起来很正确)是一件可怕的事情。
  • 这种情况正是枚举的目的。
  • @Jay:关于命名,你可以随意命名枚举及其枚举数。使用大写字母,不要使用大写字母,无论如何。无论您选择如何命名它们,只要在代码中保持一致即可。

标签: c++ boolean c-preprocessor


【解决方案1】:

你可以使用枚举:

enum LoadType {
    LoadY,
    LoadX
};

或者,您可能更喜欢使用命名空间来限制枚举器的范围:

namespace LoadType {
    enum Type {
        LoadY,
        LoadX
    };
};

使用枚举的好处是,如果您的函数采用LoadType(或第二个示例中的LoadType::Type),则不能将任意整数或布尔值传递给它;您只能将其中一个枚举器传递给它(或显式转换为枚举类型的东西,这在代码审查中很容易发现)。

【讨论】:

  • “你不能给它传递任意整数或布尔值;你只能给它传递一个枚举数” 在 C++ 中不是。在 C++ 中,整数将被隐式转换为普通枚举。但是,从 C++11 开始,现在可以使用 类型安全的范围枚举。
【解决方案2】:

我会改用枚举。仅仅因为有两个选择,并不意味着类型应该是 bool

enum load_type { loadX, loadY };

【讨论】:

  • 如果你喜欢帽子,那就去吧。标准库不将它们用于枚举。
  • @litb:所有常量和宏的大写!您可以分配的东西和东西的非上限!
  • @LouFranco:我很难将标准库作为良好设计的示例。
  • @Tomalak “所有”“精心设计”的库,如 qt 和 llvm,对常量使用非大写字母。
  • @Tomalak,是的——我同意宏应该使用全大写。由于我没有使用宏,所以我没有使用它们。
【解决方案3】:

如果您只有两个选择,我想这可行。我很想去枚举:

enum LOADMODE {
    LOAD_X,
    LOAD_Y
};

至少,比起宏更喜欢常量:

const bool LOAD_X = true;
const bool LOAD_Y = false;

他们将遵守范围规则,并且不会在您没有意识到名称冲突时默默地破坏内容。

【讨论】:

  • 我非常喜欢枚举,但至少在 C++98 中我认为我会使用常量,如果只是因为枚举值名称在枚举所在的任何命名空间中都可用。幸运的是 C+ +0x 引入了enum class,除此之外,它并没有这样做,使得enum class load { X, Y }; 之类的东西可能与XY 无法与任何东西发生冲突。
  • @fow:您可以轻松地将枚举包装在命名空间或类中以限制枚举器的范围。
  • @fow 常量在它们定义的任何命名空间中都可用。
  • 如果你在一个类中定义其中任何一个会怎样?它只会留在课堂上,对吧?
  • 对。我只想提一下enum class,因为就像我说的,我太喜欢枚举了。 :)
【解决方案4】:

我认为加载 X 是加载。 小写字体看起来更友好,可以选择鲜艳的颜色。 枚举负载类型 { 加载Y, 加载X 没关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2014-10-05
    相关资源
    最近更新 更多