預編譯指令在乙個工程中的簡單用法
比如乙個animal類,下面派生出乙個fish類
為了方便起見,每個類就乙個呼吸breath方法,來區分呼叫
新增如下 cpp檔案和標頭檔案,其中類的定義放在標頭檔案中,類的成員實現放在cpp檔案中
你要在cpp檔案中包含相應的標頭檔案,否則找不到類的定義
下面開始寫**
首先 animal.h
class animal
;
相應的animal.cpp中#include "animal.h"
#include animal::animal()
{}void animal::breath()
;
相應的fish.cpp中
#include "fish.h"
#include fish::fish(){}
void fish::breath()
主函式要包含animal.h 和 fish.h 標頭檔案
好了我們編譯
結果編譯器報錯 : error c2011: 'animal' : 'class' type redefinition 類重複定義 為什麼呢???
下面請分析程式!
當程式從主函式進入時首先展開animal.h標頭檔案 並定義了animal類
然後又展開fish.h標頭檔案,但這時,fish.h標頭檔案中又包含了animal.h標頭檔案,又開始定義animal類,發現已經定義了 錯誤找到了
但是怎麼解決呢?就要用到預編譯指令了
#ifndef *** //如果沒定義***
#define *** //那麼就定義***
#endif// 結束
下面把animal.h 和 fish.h 中修改為
#ifndef animal_h
#define animal_h
class animal
;#endif
#include "animal.h"
#ifndef fish_h
#define fish_h
class fish:public animal
;#endif
在次編譯,無錯誤!!! 分析一下,像上面當展開fish.h標頭檔案時,前面已經定義了animal_h 當再次試圖定義時就不會執行了!!!
有人會問 animal_h 和fish_h有什麼用呢?
animal_h 和 fish_h 其實沒啥用,它倆只是乙個標誌,要麼你拿什麼來判斷類是否定義過了呢?
它們儲存在編譯器的全域性變數裡,你可以理解為咱們一般寫程式時的flag
C 預編譯指令
下面對c 中的預編譯指令進行介紹 1.define和 undef 用法 define debug undef debug define告訴編譯器,我定義了乙個debug的乙個符號,他類似乙個變數,但是它沒有具體的值,可以將它看為乙個符號而已。undef就是刪除這個符號的定義。如果符號debug沒定義...
pragma預編譯指令
它的作用是設定 編譯器的狀態或者是指示編譯器完成一些特定的動作。其格式一般為 pragma para。其中para 為引數,下面來看一些常用的引數 message 引數能夠在編譯資訊輸出視窗中輸出相應的資訊,這對於 源 資訊的控制是非常重要的。其使用方法為 1 pragma message 訊息文字...
Unity Shader預編譯指令
我們在unity中最常見的就是下面前兩種,使用就不必介紹了,這裡會針對其它一些較為常用的編譯指令做一下詳細介紹。1 pragma vertex name 編譯name函式為頂點著色器 2 pragma fragment name 編譯name函式為片段著色器 3 pragma geometry na...