⑴ c語言頭文件避免重復包含,pragma once和#ifndef的區別
1) #pragma once用來防止某個頭文件被多次include,
#pragma once是編譯相關,就是說這個編譯系統上能用,但在其他編譯系統不一定可以,也就是說移植性差,不過現在基本上已經是每個編譯器都有這個定義了。
2) #ifndef,#define,#endif用來防止某個宏被多次定義。
#ifndef,#define,#endif這個是C++語言相關,這是C++語言中的宏定義,通過宏定義避免文件多次編譯。所以在所有支持C++語言的編譯器上都是有效的,如果寫的程序要跨平台,最好使用這種方式
最好看看這篇文章
http://blog.csdn.net/liulina603/article/details/12083723
⑵ VC如何解決重復包含頭文件的問題
語法上對頭文件里的內容沒有任何限制
c++語法有個要求就是任何名字(類型、變數或者函數什麼的)都要「先聲明後使用」,注意這個要求的范圍是在同一個文件里,就是說你這個.cpp里用到的東西必須在你這個.cpp里先有聲明。 如果你要用string類的變數, 你就必須先寫清楚這個類型的聲明,編譯器才知道怎麼去編譯這一段。 所以你要是不怕累的話你可以就挨個用到的地方重復寫一下,但是因為這個可能很麻煩, 也可能會幾個地方寫的不一致, 解決辦法就是採用一個頭文件,每個地方都include這個頭文件, 就相當於寫了這個類型的聲明。 include命令的作用就是把那個頭文件的內容復制到這里來, 至於頭文件裡面到底寫了什麼其實是沒有語法要求的,但是如上所述, 頭文件既然主要是解決這個聲明的問題, 所以當然你看到的頭文件里主要內容還都是聲明。 現在模板橫行的時候由於一些技術問題造成頭文件里也寫了很多實現, 這個解釋起來有點麻煩,你可以不搭理它
所以總結一下, C語言要求先聲明後使用,所以用頭文件來形成一個統一聲明, 而之所以要防止重復include頭文件,是因為一個cpp里一個名字是不可以被定義多次的, 所以對那些聲明=定義的東西如果重復include了,編譯的時候就容易出現重復定義的錯誤,當然對有些聲明跟定義截然分開的情況來說,重復include也沒問題
⑶ 關於自定義頭文件在多個文件中引用時提示重復定義的問題(C語言)
#ifndef identifier_h
#define identifier_h
....
#endif
這套條件編譯是為了防止同一個.c文件中包含多個相同.h文件的(比如有一個.c文件包含了a.h,a.h又包含了b.h,那麼當你在這個.c文件中同時包含了a.h和b.h時,因為有上面的條件編譯的關系而不會出錯)。因為編譯器在編譯的時候是按照.c文件為單位編譯的,每個.c文件編譯成.o文件(linux系統)或者.obj(windows系統),然後再將這些.o文件鏈接起來,最後與運行庫鏈接形成可執行文件(elf或exe文件)。
你在兩個.c文件中包含了同一個.h文件。這根本和條件編譯沒什麼關系。你在.h文件中定義了全局變數a, b, c。那麼就表示你兩個.c文件中,每個.c文件中都有這樣的全局變數定義:int a, b, c;當每個.c文件單獨編譯當然沒有問題,但是當它們鏈接起來的時候就出現問題了:兩個.c文件中都有變數a b c,所以當然是重復定義啊。問題是出在鏈接的時候的。
⑷ C語言中防止重復包含頭文件的固定格式的疑問
不是頭文件重復包含問題! 而是你的 兩個成員函數 有問題! 如果要把函數 聲明與定義分開要麼一個用.h 文件另一個用cpp文件, 要麼用繼承。
你只需要把兩個函數的實現放在 a.h 裡面就好了!
另外,為了防止頭文件重復包含的最好方法是在 有課能重復的文件(本題a.h)加上
#progma once
請採納啊! 我也遇到同樣問題,今天搞了好久才總結的……
⑸ C語言的頭文件問題
為防止頭文件被重復使用.
假如說, A.h要用到B.h的內容, 那麼在A.h里必須得加上#include "B.h", 但是如果A.cpp中也要用到B.h內的東西, 那麼一般也會習慣上在A.cpp里加上#include "B.h".
那麼問題來了, A.h已經加了B.h, A.cpp再加入B.h, 這樣就會重復定義一些東西, 會報錯.
但是如果每加入一個頭文件, 都定義一個宏, 這樣只用判斷這個宏有沒有被定義, 就可以知道這個源文件有沒有包含過這個頭文件了.
這東西在C++里是非常亂的, 因為C++里有類, 類有繼承.
⑹ C語言 頭文件相互引用的問題
增加頭文件c.h包含a.h,b.h 聲明void testb();
在c.c內實現testb();
另外防止頭文件被多次包含時重復定義 需要用
#ifndef
#define
````
#endif
來修飾頭文件內容 以防止重復編譯
⑺ C語言里防止頭文件被重復定義的問題
恩,樓上對的,宏定義約定用大寫,其實用graphics_h也不會報錯
graphics.h不是合法的宏名,因為.,宏名只能由字母數字下劃線組成,且以字母或下劃線開頭
⑻ (C語言)定義宏 以防止重復包含此頭文件 這句話是什麼意思
當1個C語言程序由 多個 源程序文件 組成時,由於每個 源程序文件 都有 #include <...>
#include "...h", 最終它們可能形成交叉 包含 和 重復包含 現象 而造成錯誤。
為了避免這種情況發生,可以 採用 定義宏 的方法 把各個頭文件 包起來。
編譯器 在正式編譯的開始,現處理 宏 -- 也就是「預編譯命令".
用 宏(#號開始的行) 把 頭文件內容 包起來:
#ifndef _HEADER_One_H_ // 意思是:宏開始行,如果還沒有定義 _HEADER_One_H_ 則 進入,否則退出
#define _HEADER_One_H_ //定義 _HEADER_One_H_//
header1.h
頭文件內容
#endif // 宏結束行
⑼ c語言如何避免重復包含頭文件
#include 通常不會包含 .cpp 文件,如果包含的話,一般僅會包含如 static 的函數這樣不會因為多次包含而導致鏈接問題的。
為了防止重復包含,頭文件中都會有相應的處理,比如加上
#ifndef _STDIO_H_
#define _STDIO_H_
// 真正的頭文件內容
#endif
這樣在多次包含的時候,因為已經定義了 _STDIO_H_,所以第二次包含的內容會被忽略。
比較新的 C++ 編譯器也支持 #pragma once,這樣只要在頭文件開頭寫上這一句,編譯器就會在處理頭文件的時候不包含多次了。