我用来放置常量,如:
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
会发生变化。这有点烦人。
这种方法是否标准?有什么替代方案?
答案 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即可回答您的问题。