2011-07-21 53 views
2

我正在開發一個有供應商提供的API的項目。我已經創建了一個在我的項目中使用該API的類,並且在我的stdafx.h文件中包含了供應商頭文件。事情不會編譯。stdafx.h的目的(和:爲什麼不工作?)

我然後把#include直接進入我的類的頭文件,現在的東西編譯(是的,我的課包括stdafx.h所以這是不是這個原因。

做任何你有任何的猜測,爲什麼它不會第一次編譯?這不是一個項目,但我寧願如果我可以保留所有供應商的API文件在他們所屬的stdafx.h

編輯:問題解決了,我創建了一個循環依賴關係,忘記了#ifndef頭文件,然後按錯誤的順序包含它們。我覺得自己像個白癡。

+1

1)您是否嘗試過重新創建預編譯在添加你的庫之後添加頭文件? 2)並非所有的依賴關係都可以被滿足......將自己的功能添加到stdafx的最後一行,如果它使用一些默認庫。這只是一個建議,所以不是張貼作爲答案 – Raiv

回答

1

stdafx.h主要用於VS生成的項目中作爲預編譯頭的'容器'。

當你添加了一個新#includestdafx.h它沒有得到包括在內,因爲你的項目很可能配置爲使用預編譯的頭,當你添加了一些stdafx.h需要重新生成一個包含預編譯的信息.PCH文件。

要做到這一點的一種方法是在您的項目中有一個除了#include "stdafx.h"之外什麼也不做的.cpp文件。也許把它叫做'precompile.cpp」然後去項目設置對於一個.cpp文件並更改以下設置(所有配置):

"C/C++ | Precompiled Headers | Precompiled Header" setting 

,並選擇"Create /Yc"

那將設置構建,以便當需要構建precompile.cpp(因爲它包含的stdafx.h標題已更改)時,它將重新生成一切使用的.pch文件。

+0

不幸的是,這不起作用(Visual Studio 2010已經有該文件,'stdafx.cpp'已經有屬性Create(/ Yc) – medivh

+0

@medivh:我已經忘記了'stdafx.cpp'。但是,我描述的過程'在我的機器上工作' - 我試過了。不知道爲什麼項目構建過程不會自動完成你的變更(但是預編譯頭文件有一定的挑剔/容易出錯的聲譽)嘗試完全重建你的項目(或者一個乾淨/構建的步驟) ,或手動編譯'stdafx.cpp'(右鍵單擊並選擇編譯),然後重新構建您的項目。 –

1

編輯:等等 - 我不認爲我讀了正確的問題。不過,可能仍然有幫助。

stdafx.h的另一個名字是「預編譯的頭」

真的沒有在任何stdafx.h「供應商細節」,它的作用是預編譯頭,這樣編譯器不必重新編譯他們每次建立該項目。

如果你有一個巨大的項目(或者包含大量標題的小項目),這才真正有用。

我使用Visual Studio 2010爲好,一般不值得大驚小怪 - 我只是禁用它(這將解決您的類夾雜物的問題也 - 使自己的頭部,堅持供應商的在那裏)。

+1

每次我試圖刪除和禁用'stdafx.h',*的Visual Studio *尋求對我的報復。我最終放棄了它。 – wallyk

+0

「它預編譯頭」 - 沒錯,但是當我堅持我的供應商提供的頭在那裏,它應該是和編譯。我可能不得不強制重新編譯。我會看看是否有幫助。 – medivh

+0

@wallyk - 我認爲自從我從vs2008切換以來,我沒有**使用過預編譯頭文件。只要沒有時間就開始項目,它根本不會抱怨。 @medivh - 這可能是一個想法,因爲我能想到的唯一的其他事情是如果文件包含在'stdafx.h'的錯誤部分中。 – Schnommus