在哪里放C ++常量?在分离/共享头(main.h)文件中?

时间:2016-10-30 21:48:22

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

我用来放置常量,如:

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会发生变化。这有点烦人。

这种方法是否标准?有什么替代方案?

1 个答案:

答案 0 :(得分: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即可回答您的问题。