2010-06-23 267 views
0

所以,#include被忽略

我有這段代碼我試圖更新。它是爲Visual Studio 6編寫的,我試圖在Visual Studio 2010中編譯它。

在stdafx.h中,它包含afx.h和afxwin.h以及其他一些必要的程序上班。值得注意的是,在其他頭文件中使用了CString。

在stdafx.h中包含的頂部,我添加了#pragma消息來驗證它是否先被編譯。頭文件頂部還有一個引發錯誤的文件。我可以從編譯器輸出中看到,stdafx.h是首先編譯的,所以這很好。

但是,有錯誤。 (CString沒有被認爲是一種類型。)所以,我決定確保它通過了所有的包含。因此,我在#include之後放置了另一個#pragma消息,並且不會打印該消息。

這是不是真的被包括在內?

+2

CS中的VS 6次是一個類,它後來改爲模板。也許它有什麼應該由此呢?你可以發佈確切的編譯器錯誤吃了相關的代碼嗎? – 2010-06-23 17:29:05

+1

發佈一些代碼片段。 – 2010-06-23 17:29:26

+0

用我最初的評論發佈了一個關於CString更改爲模板過去VS 6的答案。 – 2010-06-23 17:43:34

回答

0

將我的評論通過回答。

CS中的VS 6次是一個類,它後來改變成爲一個模板。也許它有什麼應該由此呢?

該問題與使用CString的 typedef有關。發佈VS 6, 這是不可能的。我只是手工更改了 引用,現在編譯 。

1

你的解釋有點難以遵循,但我認爲你會遇到普通編譯和預編譯頭之間的差異。

使用預編譯頭文件,編譯器正常處理第一個文件(新項目嚮導爲此設置了stdafx.cpp)。在處理用於預編譯控制的項目選項中設置的包含文件(通常爲stdafx.h)後,編譯器將其狀態保存爲.pch文件。

對於其他每一個文件,編譯器都會在不經任何處理的情況下瀏覽文件,只需查找包含文件即可。然後它讀取.pch文件,加載保存的狀態,並繼續正常解析和編譯。

這種設計的一個結果是stdafx.cpp中#include "stdafx.h"以上的任何行都成爲狀態的一部分,並且被所有其他文件看到。而其他文件中的#include "stdafx.h"以上的行被忽略。

+0

擊敗了我。我想你所說的是,你打印stdafx.h的消息,並且當你編譯一個包含stdafx.h的文件時,你看不到這條消息:那是因爲它不是再次重新編譯stdafx.h,它是從編譯stdafx.cpp時獲取保存的狀態。您應該在stdafx.cpp文件中看到該消息。 – Rup 2010-06-23 17:35:30

+0

我明白了,現在。這是由於從VS 6以來CString的變化。謝謝。 – 2010-06-23 17:35:45

0

該問題與使用CString的typedef有關。發佈VS 6,這是不可能的。我只是手工更改引用,現在編譯。

+0

編輯您原來的帖子不要發表一個答案......'這只是當地的禮儀:) – Goz 2010-06-23 17:48:18