C++ 宏和預編譯 預編譯頭


備注:本小節我也寫不出來了個所以然,本人學習C++沒有多長時候。如果你們有好的建議和想法請聯系告知。謝謝。

C++ 宏:

     宏展開:在代碼中出現的宏,會用宏實體代替。宏一般都是用大寫字母。

#define 定義常量、函數宏

#undef  結束常量、函數宏定義

C++ 預處理器:

     預處理器處理源代碼,在編譯器之前運行。預處理器用指定的頭文件的內容替代每個#include.

     預處理器變量有兩種狀態:已定義和未定義。#define 指示接受一個名字並定義該名字為預處理器變量。#ifndef 指示檢測指定的預處理器變量是否已定義。

    如果未定義,那么跟在其后的所有指示都被處理,直到出現#endif.

#pragma 一般格式為:#pragma para 其中para為參數

#pragma once 多次包含保護。只要在頭文件的最開始加入這條指令就能保證頭文件被編譯一次(這點我暈了,不是頭文件參與編譯嗎),考慮到兼容性好多地方都沒有廣泛使用。

等價於

#ifndef **

#define **

//TODO:

#endif

C++ 預編譯頭

   預編譯頭大家應該都見過,國內用VC++的應該很多。我當初第一次看見  #include "stdafx.h" ,我真暈了。

后來才知道,這是有關預編譯頭的。

   “預編譯頭” 一開始聽見這個名字覺得很怪異。怎么不是“預編譯頭文件” 它有什么作用?

C++預處理時,只是將“宏定義、頭文件”加載到源文件.cpp文件。說白點就是把頭文件里內容直接“粘帖”到相應的 #include 語句處。

以下為為引用他人博客內容

     頭文件的出現,固然給書寫程序帶來了很大方便。可是到了 Windows 時代后,慢慢就呈現出一些問題了。幾乎所有的 Windows 程序都必須包含 windows.h,而那個文件卻碩大無比,將它展開后往所有文件中一粘貼,編譯的時候立刻慢得像只蝸牛。

    到了 MFC 時代后,情況更為惡劣了。畢竟 C 風格的 Windows 頭文件里面包含的還僅僅是函數定義和宏,編譯難度不算太大,而 MFC 庫里面的頭文件可都是類聲明啊!更何況,一個最簡單的工程,都會生成大量的類,需要用到大量的函數。如果工程稍微復雜一些,編譯難度可想而知!
  但是,人們驚奇地發現,雖然用到的頭文件又多又雜,但是在一個工程中,總有那么一堆頭文件,是幾乎所有 cpp 都必須包含的。那么,可不可以把這些頭文件提取出來,只編譯一遍,然后所有其它 cpp 就都能使用呢?沒錯,這就是預編譯頭的思想都由來!

  實踐證明,使用了預編譯頭技術后,編譯速度大大提高了。可以到你的工程目錄下的Debug 或 Release 目錄中看一看,里面有一個體積極為碩大的 .pch 文件,那就是傳說中的“編譯之后的預編譯頭”。

預編譯頭的概念:
所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件里(通常是以.pch為擴展名的),這個文件就稱為預 編譯頭文件這些預先編譯好的代碼可以是任何的C/C++代碼--------甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會被經常 改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。

預編譯頭的使用:
     要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的代碼和其他的頭文件,然后我們用這個頭文件來生成一個預編譯頭文件(.pch文件)
 想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個“系統級別”的,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。那么我們如何指定它來生成預編譯頭文件。我們知道一個頭文件是不能編譯的。所以我

們還需要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件

里只有一句代碼就是:#include “Stdafx.h”。

以下為我參考別人的成果:

 1.預編譯指令

01) #
空指令,無任何效果

02) #include
包含一個源代碼文件

03) #define
定義宏

04) #undef
取消已定義的宏

05) #if
如果給定條件為真,則編譯下面代碼

06) #else
作為其他預處理的剩余選項進行編譯

07) #ifdef
如果宏已經定義,則編譯下面代碼

08) #ifndef
如果宏沒有定義,則編譯下面代碼

09) #elif
如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼

10) #endif
結束一個#if……#else條件編譯塊

11) #line
改變當前的行數和文件名稱

12) #pragma
為編譯程序提供非常規的控制流信息

13) #error
停止編譯並顯示錯誤信息

接下來講解:C++ 聲明與定義 C++ 內部連接與外部連接

靜靜的尋找屬於自己的.....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM