2016-10-30 66 views
0

我用它來把常量,如:把C++常量放在哪裏?在分離/共享標題(main.h)文件中?

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

把它們放在任何需要的地方。不要將他們暴露在他們不在的地方。 – DeiDei

+2

默認情況下,命名空間範圍內的const對象是'static',因此將在每個包含頭部的TU中放置一個單獨的對象(這可能會或可能不會被鏈接器優化爲單個對象)。 ** _不是理想的**。 – ildjarn

+0

TU是什麼意思? – KcFnMi

回答

1

替代方法是使用extern關鍵字。在文件main.cpp中包含常量定義,並在main.h中包含外部聲明。這種方法會生成一個額外的文件main.cpp,但在所有翻譯單元中只有一個常量實例。例如,如果你想在project.cppconst int year = 2016(在一個目錄下的所有文件):

$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是回答你的問題。