一.頭文件本身不會被編譯 除非被.cpp文件包含 纔會被編譯 被一個.cpp文件包含 那麼整個程序只有一份.h的 相當於說真正會成爲可執行代碼的只有源代碼文件而頭文件只是起輔助作用用到時包含的時候才編譯一次 包含一次那麼一個頭文件與一個源文件組成一份然後被編譯器編譯成一個目標文件(UNIX爲.o windows:.obj),然後運行時 從主函數進入 也就是說頭文件你寫了 並不會被編譯 只有在被源文件包含纔會copy一份作爲變量或函數聲明 當然如果你在頭文件定義全局變量了 那就定義了 而不用擔心頭文件定義了一個變量 一個源文件包含會不會有兩個變量引起重複錯誤 是不會的
但如果多個源文件包含一個頭文件 而頭文件有定義變量/函數
那就會有多個同名實體編譯就通不過(t)
參考:
-------------------------------------------------------
ifndef 是if not define的縮寫,是宏定義的一種 但其功能是預處理(1.宏定義 2.文件預包含3.條件編譯)中的條件編譯,
有點像 if not但是比之if not
#include<stdio.h>
這是一個頭文件但是一般編譯器會將庫文件自動連接進來 所以printf函數的聲明在.h而實現在包含的lib/dll中
相當於一個大的工程分成了好幾個.cpp而.h文件你不包含在源文件的話是不會執行的
所以既然不能阻止多個源文件包含同一個含有定義的頭文件那 ifndef又能幹什麼的
是防止這種情況:ifndef這套條件編譯是爲了防止同一個.c文件中包含多個相同.h文件的(比如有一個.c文件包含了a.h,a.h又包含了b.h,那麼當你在這個.c文件中同時包含了a.h和b.h時,因爲有上面的條件編譯的關係而不會出錯)。
就是在一個源文件中不會套娃娃出錯 套好幾個
一般是作用於頭文件 有點類似 if()else()選擇語句,但是吧 比那些節省資源快速 是在編譯中弄得 而不是在執行中
2.初次之外 #program once也是這個功能 只(一個源文件內)只編譯一次 但是ifndef 有些不同
(1) 你無法對一個頭文件中的一段代碼作pragma once聲明,而只能針對文件。
(2)因爲#ifndef受C/C++語言標準的支持,不受編譯器的任何限制;
而#pragma once方式卻不受一些較老版本的編譯器支持,一些支持了的編譯器又打算去掉它,所以它的兼容性可能不夠好。
參考1.
1.https://www.cnblogs.com/challenger-vip/p/3386819.html
2.