簡體   English   中英

C ++預編譯頭和包含的文件組織

[英]C++ Pre-compiled header and included file organization

我有一個非常大的Native C ++項目,在其各自的.cpp和.h文件中定義了數百個類。 這里沒什么奇怪的。 我在預編譯的頭文件stdafx.h文件中聲明了所有類,並在stdafx.h文件中將其包括在內,如下所示(以允許Foo引用Bar和Bar引用Foo)。

這是組織的不良做法嗎?

本質上,所有類都被聲明並包含在每個對象中。 我假設編譯器不會通過包含某些東西來生成開銷二進制文件,而這些東西對於編譯特定的.cpp目標文件而言不是必需的。 到目前為止,我在編譯時也沒有任何問題。 我只是想知道這是否對代碼不利。

我喜歡這種布局,因為stdafx.h文件在本質上是一個代碼映射,因為所有類都在此處聲明,並且它揭示嵌套的名稱空間是一種易於閱讀的格式。 這也意味着我的個人類.h文件不需要幾個include語句,這意味着在更改文件名或目錄時,我需要維護的代碼更少。

stdafx.h中:

#pragma once
namespace MyProject
{
    class Foo;
    class Bar;
}

#include "Foo.h"
#include "Bar.h"

foo.h中:

#pragma once

namespace MyProject
{
    class Foo
    {
        // Declare class members, methods, etc
    }
}

Foo.cpp中:

#include "stdafx.h"

namespace MyProject
{
    class Foo
    {
        // Define class members, methods, etc
    }
}

我認為這里有4個關鍵因素:

  1. 編譯時間:請記住, #include "xh"在該行將所有代碼嵌入xh。 如果項目要大幅度增長,請注意如何影響未來的編譯時間。
  2. FooBar穩定性:如果FooBar發生了變化,您將不得不繼續重新編譯stdafx.h
  3. 循環定義:您將不再能夠使用前向聲明來破壞循環定義。
  4. 顯式依賴項:您將無法查看自己的包含項,也無法知道特定文件中使用的內容。

如果您覺得自己的優點勝於此處列出的缺點,那么您所做的一切都沒有違法行為,那就去吧!

  1. 標頭應包含其所需的所有內容,不能多也不少。
    這是易於使用和簡單封裝的基本要求。

    您的示例明確指出了這一點。

    要檢測違規,請始終首先在翻譯單元中包含相應的標頭。
    如果使用預編譯頭,則需要稍加修改,在這種情況下,必須先包含它們。

  2. 預編譯的標頭應僅包含很少更改的元素。

    對預編譯頭或其依賴項的任何更改都將強制重新編譯所有內容,這與完全使用一個文件背道而馳。

    您的示例也未能解決這一問題。

總而言之,有很多改進之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM