1樓:奧麥地道
「為什麼編譯器不自己限制對一個檔案只包含一次」:
因為對同一個檔案包含兩次可能是部分**需要,我就在一個比較成熟的專案裡面看到過 對一個標頭檔案包含兩次的,大致原理如下:
標頭檔案f.h裡面 有兩部分,分別被 macro_a 和macro_b包括著,
在g.c裡面某個地方,先定義了macro_a,然後include f.h,接著undef macro_b
在後面某個地方 又定義了macro_b,然後include f.h,再接著undef macro_b
c語言標頭檔案避免重複包含,pragma once和#ifndef的區別
2樓:李廣英
#pragma once 和 #ifndef在c++中都能使用。
#pragma once好像不在c中使用吧?!#ifndef可以在c中使用。
#pragma once的用法:在.h中最前面寫上就行。
#ifndef的用法:
#ifndef _my_h_
#define _my_h_
//標頭檔案內容
#endif
3樓:匿名使用者
pragma 是微軟的!
#ifndef是世界的
c++標頭檔案中 #ifndef是什麼意思?
4樓:匿名使用者
定義成空的唄
這就是個小技巧, 為了防止兩次include同一個標頭檔案。
第一次include的時候由於 ns_telnet_h沒定義,所以巨集裡面的內容(也就是標頭檔案的全部內容了) 會被編譯。 而第二次include它的時候由於 ns_telnet_h已經被定義,所以巨集裡面的內容不會被編譯。 這個巨集沒define成任何有意義的東西,是因為實際上只是需要ns_telnet_h存在就可以,它的內容無所謂
c++中#pragma once和#define是幹什麼用的
5樓:好多小幸福
這是一個比較常用的c/c++雜注,只要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次。
#pragma once是編譯器相關的,就是說即使這個編譯系統上有效,但在其他編譯系統也不一定可以,不過現在基本上已經是每個編譯器都有這個雜注了。
#ifndef,#define,#endif是c/c++語言中的巨集定義,通過巨集定義避免檔案多次編譯。所以在所有支援c++語言的編譯器上都是有效的,如果寫的程式要跨平臺,最好使用這種方式
c++ 標頭檔案中加入 #ifnodef #define #engif 有什麼用
6樓:帝釋天參
你說的是c語言中的巨集定義,也是預編譯指令
首先,你對巨集定義的書寫有誤,#ifnodef應該是#ifndef,#engif應該是#endif
接下來我們說說這幾個巨集定義的用法
#define:這個巨集定義就是使用一個命名來替代另一個。比如#define age 5
那麼,在程式中,填入age,在預編譯的時候,編譯器就會自動將age替換成5,注意,這個是直接替換,所以如果#define x 3+1,那麼在程式中輸入5*x,編譯器就會將其替換成5*3+1,這種情況一般會這樣定義#define x (3+1)
#ifdef、#ifndef、#endif:一般#ifdef/#ifndef和#endif是成對出現的。
#ifdef顧名思義,就是如果定義了某個巨集。比如
#ifdef age //如果之前有#define age value(這個是age對應的值),就執行下面的語句
//do something
#endif //執行語句到這裡結束
#ifndef與#ifdef正相反,直譯是if not define,就是如果沒有定義某個巨集,就執行if內的語句。如:
#ifndef age //如果之前沒有#define age value(這個是age對應的值),就執行下面的語句
//do something
#endif //執行語句到這裡結束
7樓:倒黴熊
你這裡寫的單詞不對吧如果我沒記錯的話
應該是#ifndef
#define
#endif
不加也沒有什麼問題,簡單程式來說不會報錯的,但複雜程式就可能會產生問題了。
這主要用來解決 標頭檔案重複包含問題,防止出現重複定義的錯誤。
8樓:匿名使用者
如果不加,多次引用時,會造成重複定義變數啥的
標頭檔案中主要是定義一些公共的變數(全域性)或類的宣告與實現
如果在不知道的情況下,標頭檔案間相互引用 就會造成重複引用 ,導致出錯
9樓:依稀紅顏落
這個是預編譯命令。http://baike.
具體應用來說,我知道的,多平臺遊戲引擎會通過這些命令分別編譯對應平臺的資源。
c++中program once有什麼作用
10樓:仙戈雅
#pragma once 指令是讓編譯器只包一次該檔案。這樣就不會出現重複包含檔案的現象。類似於#if...這些巨集定義。
11樓:盧幼綦德容
這是一個比較常用的c/c++雜注,只要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次。就這樣用就行了。沒有結束,不過是對當前標頭檔案來說的,出了這個檔案就管不了了。
12樓:匿名使用者
防止該標頭檔案被多次 #include
標頭檔案中的 ifndef/define/endif 幹什麼用?
13樓:
#ifndef、#define、#endif為c語言的3條預處理語句,主要用作條件編譯。先介紹一下條件編譯:
一般情況下,源**檔案中的所有行都參加編譯,但有時需要指定一部分**在某個條件下才被編譯,這就叫做條件編譯。
條件編譯發生在預處理階段,在c中,主要通過#if、#elif、#else、#ifdef、#ifndef、#endif來給一段**附加上編譯條件,然後前處理器收集滿足條件的可以進行編譯的**,這樣經過預處理,不滿足條件的**就不會被編譯。
這3個預處理語句的功能分別為:
#ifndef symbol
語句塊#endif
如果沒有定義符號symbol,那麼就編譯下面指定的語句塊,用endif來表示條件編譯語句的結尾。
#define symbol
定義一個符號symbol。
這三個預處理語句用在一起可以解決標頭檔案被重複引用的問題:一個.c源程式中可能引用了多個標頭檔案,而被源程式引用的標頭檔案又有可能存在引用關係,比如a.
h引用了b.h,然後在源程式中同時引用a.h和b.
h,就會產生這個問題,這時編譯器會產生符號重定義之類的錯誤。為了防止該問題,就需要在標頭檔案中加入以下語句:
#ifndef symbol
#define symbol
標頭檔案包含的內容
#endif
這樣即可防止該標頭檔案被重複引用。symbol一般採取以下方式命名:_標頭檔案名_h,當然也可採取其他方式。
另外,對於有的編譯器也可以在標頭檔案中加入#pragma once來防止標頭檔案被重複引用
14樓:樓飇回驪娟
在一個大的軟體工程裡面,可能會有多個檔案同時包含一個標頭檔案,當這些檔案編譯連結成一個可執行檔案時,就會出現大量「重定義」的錯誤。在標頭檔案中實用#ifndef
#define
#endif能避免標頭檔案的重定義。
方法:例如要編寫標頭檔案test.h
在標頭檔案開頭寫上兩行:
#ifndef
_test_h
#define
_test_h//一般是檔名的大寫
標頭檔案結尾寫上一行:
#endif
這樣一個工程檔案裡同時包含兩個test.h時,就不會出現重定義的錯誤了。分析:
當第一次包含test.h時,由於沒有定義_test_h,條件為真,這樣就會包含(執行)#ifndef
_test_h和#endif之間的**,當第二次包含test.h時前面一次已經定義了_test_h,條件為假,#ifndef
_test_h和#endif之間的**也就不會再次被包含,這樣就避免了重定義了。
15樓:
1樓 說得不錯 頂了
C 的標頭檔案宣告與使用問題,c 在標頭檔案中宣告一個類,但是在主函式定義該類的變數時卻出錯了。怎麼回事?
每個c 標頭檔案都會有對應的函式庫相支援,一般ide編譯器 會完成這個處理,如果回沒有,則需要開發者自己答增加相應的函式庫。函式庫中有標頭檔案中的函式的具體實現內容。如果是自定義的函式和標頭檔案,則需要開發者自己完成相應的函式與實現了。標準e68a8462616964757a686964616f31...
C語言標頭檔案是什麼,c語言中的標頭檔案是什麼概念
標頭檔案是你程式中需要用到東西,如需要某個數學函式,則必須包括數學相關標頭檔案,如math.h,當然,也可以自己寫函式,只要你不怕麻煩!標頭檔案是你程式中需要用到東西,如需要某個數學函式,則必須包括數學相關標頭檔案,如math.h,當然,也可以自己寫函式,只要你不怕麻煩!標頭檔案就是在你所編制的程式...
C裡標頭檔案和原始檔
在vs2012中,c 還是有.h頭問價和.cpp原始檔 但在c 中,只有.cs檔案,可以理解為標頭檔案 原檔案都在cs檔案中,需要引用的話,引用相應的名稱空間即可。首先,新增 一個c 的應用程式,如果要在c 中呼叫c 的dll檔案,先要在c 的類中新增一個靜態方法,並且使用dllimportattr...