【问题标题】:Where to put C++ constants? In a separated/shared header (main.h) file?在哪里放置 C++ 常量?在分离/共享的头文件(main.h)文件中?
【发布时间】:2017-03-13 01:15:21
【问题描述】:

我用来放置常量,例如:

const QString DATETIME_FORMAT     {"yyyy-MM-dd hh:mm:ss.zzz"};

在一个单独的文件中,main.h。实际上我把它放在一个命名空间上,比如:

namespace projectx {
  const QString DATETIME_FORMAT     {"yyyy-MM-dd hh:mm:ss.zzz"};
}

然后,当我想使用 DATETIME_FORMAT 时,我必须:

#include "../../main.h"
using namespace projectx;

根据使用 main.h 的文件所在的位置,路径 ../../main.h 会发生变化。这有点烦人。

这种方法是标准的吗?有什么办法?

【问题讨论】:

  • 把它们放在需要的地方。不要将它们暴露在它们不存在的地方。
  • 命名空间范围的 const 对象默认为 static,因此将在每个包含您的标头的 TU 中放置一个单独的对象(可能会或可能不会优化为单个对象链接器)。 理想。
  • TU是什么意思?
  • 对于给定的常量用例,似乎 constexpr 比 const 和 static 更适合(在 c++11 及更高版本中)。
  • 在编译器中使用 -I 选项来避免“../../etc”。 projectx::DATETIME_FORMAT 不需要使用命名空间

标签: c++ qt c++11 qt5 c++14


【解决方案1】:

替代方法是使用extern 关键字。在文件main.cpp 中包含常量的定义,在main.h 中包含外部声明。这种方法会生成一个额外的文件main.cpp,但您在所有翻译单元中只有一个常量实例。例如,如果您想将const int year = 2016 包含在project.cpp 中(一个目录中的所有文件):

    $cat main.cpp
    const int year = 2016;
    $cat main.h
    extern const int year;
    $cat project.cpp
    #include "main.h"
    int main()
        {
        ...
    $gcc main.cpp project.cpp -o project -Wall -std=c++11

有一个重要的细微差别:如果你在标题中使用直接定义const int year = 2016,该文件的多次包含会产生错误,但你可以多次声明extern const int year,它是有效的。您可以在this question 中阅读有关extern 的更多信息。

位于编译器搜索路径中的文件可以被包含而无需写下路径。在 GNU/Linux 中,如果文件 main.h 位于 /usr/include,那么您可以简单地通过 #include <main.h> 包含它(更多信息 here)。

如果您想将main.h 文件路径保存到QT 环境,here 就是您的问题的答案。

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多