【问题标题】:Better constant definition approach更好的常量定义方法
【发布时间】:2017-07-29 08:53:22
【问题描述】:

在探索 SQLite 源代码以进行学习时,我在源代码的许多地方都发现了这一点;

#define SQLITE_LOCK_NONE          0
#define SQLITE_LOCK_SHARED        1
#define SQLITE_LOCK_RESERVED      2
#define SQLITE_LOCK_PENDING       3
#define SQLITE_LOCK_EXCLUSIVE     4

#define SQLITE_IOCAP_ATOMIC                 0x00000001
#define SQLITE_IOCAP_ATOMIC512              0x00000002
#define SQLITE_IOCAP_ATOMIC1K               0x00000004
#define SQLITE_IOCAP_ATOMIC2K               0x00000008
#define SQLITE_IOCAP_ATOMIC4K               0x00000010

这是现代 C++(C++11、14、17)中的标准,还是在现代 C++ 中有不同的方法来做到这一点?

【问题讨论】:

  • "或者在现代 C++ 中有不同的方法可以做到这一点吗?" 可以使用枚举而不是 #define
  • 对于常量,任何东西都比#define 好。 const int SQLITE_LOCK_NONE = 0; 有什么问题?但实际上看起来你想要一个枚举
  • SQLite 不是用 C 写的吗?与现代 C++ 相比如何?
  • @tobi303 "const int有什么问题"它在文本段中占用内存。
  • @user0042 比占用不受任何命名空间或任何东西的名称更好

标签: c++ c++14


【解决方案1】:

据我所知,C++ 中的常量从来没有使用过#define 的理由。你总是可以写

const int my_constant = 42;

对于您的情况,您可能需要一个枚举

enum SQLITE_LOCK {SQLITE_LOCK_NONE, SQLITE_LOCK_SHARED, SQLITE_LOCK_RESERVED, 
      SQLITE_LOCK_PENDING, SQLITE_LOCK_EXCLUSIVE };

这在 c++11 中确实得到了很大改进,因为您现在可以将作用域枚举用作

enum class SQLITE_LOCK { .... };

PS:现代 C++ 也有 constexpr 用于编译时间常数,但我对它还不够熟悉,不能说什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多