對於VC 中的標頭檔案包含值得注意的一點

2021-04-07 00:12:48 字數 1303 閱讀 4522

今天用vc++編譯我這昨天寫的**時發現總是通不過,看到大部分的錯誤都是與乙個類的定義有關。

明明我已經在這個類中定義了乙個成員變數,可編譯器偏要說那個變數不是這個類的成員。沒辦法,找了半天原因還是沒有頭緒。再三地確認不是我c++的語法錯誤之後。我開始懷疑是不是標頭檔案的問題。因為當我把一些#include "..."

搬到#pragma once

之前或者之後,錯誤報告就會發生變化。有時就只是說我的乙個類重複定義了。

以前用c寫標頭檔案的時候都是用巨集定義來避免重複包含標頭檔案。c++裡雖然也還可用這個方法,但vc++就是不用,它用的是#pragma once

。這一變化對我來說真是有點摸不著頭腦了,我不清楚#pragma once

的工作方式是如何的。而我現在遇到的問題又與這個有關。找找網上的內容看吧。上google搜了半天,那些論壇裡的回答基本上都是「防止重複包含標頭檔案的,你不用管他。」這樣的。可是不管他真的行嗎?我剛學的vc++,我看的書上是沒有講過這個內容的。怎麼在網上也搜不到呢?經過我不懈的努力,終於讓我找到了一篇http://www.yesky.com/127/1736627_3.shtml

。作者adding的這段話對我的幫助最大:「

既然使用了包含檔案,為什麼還要在class cmainframe前新增"class cviewerview;"等**?如果用包含檔案代替它,行不行?  很多visual c++書籍對這些問題避而不談,但實際上這是乙個重要的問題。如果不能理解上述**,我們很可能為無法通過編譯而大傷腦筋。這些問題的出現是基於這樣的一些事實:在我們用標準c/c++設計程式時,有乙個原則即兩個**檔案不能相互包含,而且多次包含還會造成重複定義的錯誤。為了解決這個難題,visual c++使用#pragma once來通知編譯器在生成時只包含(開啟)一次,也就是說,在第一次#include之後,編譯器重新生成時不會再對這些包含檔案進行包含(開啟)和讀取,因此我們看到在用嚮導建立的所有類的標頭檔案中有#pragma once

語句就不會覺得奇怪了。然而正是由於這個語句而造成了在第二次#include後編譯器無法正確識別所引用的類。因此,我們在相互包含時還需要加入類似class cviewerview這樣的語句來通知編譯器這個類是乙個實際的呼叫。

」看來就是這個問題了。把我的**一加上那些類的宣告以後果然通過了編譯。我感覺這個問題在vc++裡面來說應該是值得注意的。可能是由於我剛學vc++,見識太少的原故吧。無論如何先記下來,說不定也有人在為這個#pragma once

傷腦筋呢。

sumless

2006-5-7

關於這個問題,這篇文章寫得很好:《c++中基礎類互相引用帶來的問題》

sumless

2006-6-30

C 中值得注意的細節地方 逐步更新中

1.static的作用 static對於函式來說,只有隱藏的作用,即把本函式設定為本檔案可見。static對於變數來說,不僅可以隱藏,還讓變數存放在靜態儲存區域,具有永久性和預設為零。2.struct與類的大小 在對struct和類用sizeof 取大小時,會遵循對齊原則 盡可能地湊4和湊8 例如 ...

SQL中的兩個值得注意的特殊符號

在sql中,表示字串得引號強烈建議使用單引號 雖然也可以使用雙引號 但是為了和和統一,建議都使用單引號。如果在字串中也有單引號出現的話,在 sql中需要將其替換為兩個單引號 dbms會將其解釋為乙個單引號的。關於sql的換行符和字串連線符,在my sql sqlserver和oracle中均有不同,...

SQL中的兩個值得注意的特殊符號

在sql中,表示字串得引號強烈建議使用單引號 雖然mysql也可以使用雙引號 但是為了和sql server和oracle統一,建議都使用單引號。如果在字串中也有單引號出現的話,在sql中需要將其替換為兩個單引號 dbms會將其解釋為乙個單引號的。關於sql的換行符和字串連線符,在mysql sql...