1樓:匿名使用者
語法上對標頭檔案裡的內容沒有任何限制
c++語法有個要求就是任何名字(型別、變數或者函式什麼的)都要「先宣告後使用」,注意這個要求的範圍是在同一個檔案裡,就是說你這個.cpp裡用到的東西必須在你這個.cpp裡先有宣告。
如果你要用string類的變數, 你就必須先寫清楚這個型別的宣告,編譯器才知道怎麼去編譯這一段。 所以你要是不怕累的話你可以就挨個用到的地方重複寫一下,但是因為這個可能很麻煩, 也可能會幾個地方寫的不一致, 解決辦法就是採用一個標頭檔案,每個地方都include這個標頭檔案, 就相當於寫了這個型別的宣告。 include命令的作用就是把那個標頭檔案的內容複製到這裡來, 至於標頭檔案裡面到底寫了什麼其實是沒有語法要求的,但是如上所述, 標頭檔案既然主要是解決這個宣告的問題, 所以當然你看到的標頭檔案裡主要內容還都是宣告。
現在模板橫行的時候由於一些技術問題造成標頭檔案裡也寫了很多實現, 這個解釋起來有點麻煩,你可以不搭理它
所以總結一下, c語言要求先宣告後使用,所以用標頭檔案來形成一個統一宣告, 而之所以要防止重複include標頭檔案,是因為一個cpp裡一個名字是不可以被定義多次的, 所以對那些宣告=定義的東西如果重複include了,編譯的時候就容易出現重複定義的錯誤,當然對有些宣告跟定義截然分開的情況來說,重複include也沒問題
2樓:火駒
1.標頭檔案是否參與編譯,我覺得應該參與的,你想啊,有些成員函式直接在類定義中實現的,還有些成員函式有預設引數值,如果標頭檔案不參與編譯的話,僅憑cpp檔案是無法獲取這些資訊的。
2.那是肯定的了。
3.如果4個cpp檔案都使用了string類,可以只在一個檔案包含string,如檔案a中#include ,但是另外三個檔案b、c、d中必須#include,一個類在使用前必須作宣告。
3樓:來自美國迷人的阿拉蕾
#include
using namespace std;
#ifndef string_h
#define string_h
void main()
#endif
應該是這樣吧。。保證標頭檔案只被編譯過一次
關於標頭檔案重複包含問題
4樓:匿名使用者
從問題補充來看應該是預處理上的順序問題.標頭檔案相互包含總會有一個檔案在另一個檔案中被忽略.因為預處理時include是將包含的檔案中的**插入到當前**裡,檔案是不能包含自己的,如果相互包含編譯器只能取捨一下,否則是不可能正常通過的.
在a.h中和在b.h中#include c.h, 在才c.h中include a.h和b.h,這樣的邏輯關係本來就有問題.
如果a.h被首先處理,那麼c.h中的a.h的內容很可能是被忽略了,這就導致了c.cpp找不到a的宣告.
解決方法就是重新分配定義所在的檔案,儘量讓包含關係呈樹狀結構,迴圈結構很容易出錯.
如果a,b中需要引用c,而c中又要引用ab,最好的做法就是都放到一個檔案裡,或者只將abc的宣告寫到一個總宣告檔案,再將abc的定義寫到一個檔案或者分別寫到對應的檔案,然後再在定義檔案裡包含總宣告檔案,如:
--------------------
public.h :
class a;
class b;
class c;
--------------------
a.h :
#include "public.h"
class a
--------------------
*********************************************
使用#ifndef
比如在head1.h裡用#ifndef套住要宣告的東西:
#ifndef head1_h
#define head1_h
//宣告的內容
#endif
這樣當標頭檔案被重複包含的時候會自動跳過.
5樓:匿名使用者
使用以下結構
#ifndef xx
#define xx
#endif
6樓:匿名使用者
使用#ifndef
#ifndef a_h
#define a_h
//a.h中宣告的內容
#endif
如何在vc中避免多次重複包含一個標頭檔案
7樓:丹歡
只有標頭檔案裡有標頭檔案衛士 #ifndef.... #define ..... #endif這三個字眼的 或者#pragram once這個字眼在也行, 那麼標頭檔案就可以無限的包含。
如果沒有以上標頭檔案衛士並且也沒有#pragram once那麼包含了兩次後可能會出現重複定義的錯誤。
怎麼解決標頭檔案重複包含的問題
8樓:匿名使用者
不是很明白你的問題。層層包含出什麼問題了?
通常標頭檔案定義都會加上一些預編譯指令,讓標頭檔案在被多個檔案引用的時候不會多次編譯。比如classa.h裡面可以寫:
#ifndef _classa_h_
#define _classa_h_
// source code here
#endif //_classa_h_
或者直接使用#pragma once 指令
c++ 防止標頭檔案重複include問題
9樓:踏岸尋柳
都是為了避免同一個檔案被include多次:
1 #ifndef方式
2 #pragma once方式
在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __somefile_h__
#define __somefile_h__
... ... // 一些宣告語句
#endif
方式二:
#pragma once
... ... // 一些宣告語句
#ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。當然,缺點就是如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況
#pragma once則由編譯器提供保證:同一個檔案不會被包含多次。注意這裡所說的「同一個檔案」是指物理上的一個檔案,而不是指內容相同的兩個檔案。
帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的「找不到宣告」的問題,重複包含更容易被發現並修正。
方式一由語言支援所以移植性好,方式二 可以避免名字衝突。
一般可以這樣處理:
#infndef xx
#define xx
#if _msc_ver > 1000
#pragma once
#endif..
#endif
注意:_msc_ver 是出於版本相容性考慮,定義
defines the compiler version. defined as 1200 for microsoft visual c++ 6.0.
always defined.
10樓:
#pragma once
這個指令是後來才加的,以前的版本沒有。
新的 vc 2008 生成的**, 只在開頭地方加 #pragma once 一句了,其他的都省略了。
11樓:大愚漁人
常使用的#ifndef和#endif語句。
比如說在標頭檔案中要#define irremote_h,則可以使用#ifndef irremote_h
#define irremote_h
//如果重複,這裡的**將被跳過
#endif
12樓:匿名使用者
因為#pragma once是後來引入的功能。必須要在msc版本數滿足要求時才能使用。
13樓:匿名使用者
你如果是用的編譯器自帶的檔案,它們會自動判別的。
如果你自己定義的標頭檔案
簡單的在標頭檔案的這樣就可以了啊
myh1.h
#if! defined myh1
#define myh1
#endif
這樣你怎麼include都保證不會重複。
14樓:匿名使用者
如何解決重複提交的問題,提問總是顯示重複提交問題怎麼辦?
我認為你的問題不是重複提交的問題,也跟struts無關,struts的令牌,還有提交按鈕變灰,這些都是為了防止連續兩次提交,操作做兩次這種問題,你要的可以用別的方式解決。我建議你,1.登入後把使用者資訊組織成一個bean放到session裡2.預設頁面定在登入後第一個操作頁面或者框架頁面,檢查ses...
開機速度慢怎麼解決,如何解決開機速度慢的問題?
如果原因是這樣的話,可以考慮一下幾點 1 啟動項,只留2 3個 防毒 360 文字工具欄 看你的截圖雖然不太清楚,但是像 ati 顯示卡控制面板的程式可以設定為開機禁止啟動 一般用不到其中的設定 2 關閉多餘的ied檢測 3 防毒,查木馬。這些都是開機自動執行的,會影響開機速度 4 清理登錄檔垃圾,...
如何解決績效管理工作中可能遇到的9大問
績效管理對員工抄的激勵效果不明顯bai,可能遇到的問題有 du1 績效指標不能真正zhi體現員工的付出,比如 dao僅僅關注結果,而忽視了員工的努力或者業績的提升 也或者,業績結果是偶然的 不受員工控制和影響的。這樣,就會打擊真正努力的員工。2 績效管理玩數字遊戲,好與壞全憑領導,這樣會造成管理的不...