C語言編譯預處理和預處理命令


1.預處理概念:編譯程序時,編譯器將對程序文件作至少兩個階段的編譯預處理,預處理程序預處理階段和編譯程序預處理階段。

  • 預處理程序預處理階段:C預處理程序先於C編譯程序運行。預處理程序從前向后根據預處理命令做相應的處理。預處理命令分為三類:

    ①文件包含命令

    ②宏定義命令

    ③條件編譯命令

  • 編譯程序預處理階段:

    ①將注釋替換為空格字符

    ②將續行符連接的物理行合並成邏輯行

    ③將僅用空白字符分隔的多個字符串直接連接

2.文件包含命令:在預處理程序文件時,遇到包含文件預處理命令行,都用filename文件中的全部內容替代這一行,使其成為程序文件的一部分參與編譯。雙引號包含的文件名優先在程序文件所在的目錄查找,如果找不到,再從C編譯系統指定的目錄中查找。

#inlcude <filename.h>
#include "filname.h"

3.宏定義命令:指用一個標識符來代替一個字符序列。有兩種宏形式:類對象宏(object-like macro)定義與類函數宏(function-like macro)定義。前者時不帶參數的宏定義形式,后者時帶參數的宏定義形式。帶參數宏定義中宏名和左括號之間不能有空格,右括號和宏主體之間至少有一個空格。僅有括號(沒有宏參數)是允許的。

#define 宏名(宏參數1, 宏參數2, ...) 宏主體
  • 調用形式:宏名(替換參數1, 替換參數2,...),宏參數與替換參數只有參數個數和順序的對應關系,不存在類型一致性的問題。
#define MAX(A,B) ((A)>(B)?(A):(B))
......
源文件:x=MAX(p+q,r+s);
替換成:x=((p+q)>(r+s)?(p+q):(r+s));
......
  • 對於出現在宏主體中的宏名,宏展開時不做任何替換;但它之前定義的宏名出現在宏主體時,宏展開要實施替換。
  • 包含在字符串直接常量和注釋中的宏調用形式不進行替換。
  • 宏主體是由若干符號和符號的組合構成的,不能通過宏替換形成一個常數或標識符。
  • 函數調用時,先求出實參的值然后傳給形參;宏調用僅替換不求值。

4.條件編譯命令:僅當指定條件為真時,#if控制結構包含的代碼才被編譯。主要的三種類型如下:

#ifdef 宏名
    /*程序段1*/
#else
    /*程序段2*/
#endif
#ifndef 宏名
    /*程序段1*/
#else
    /*程序段2*/
#endif
#if 表達式
    /*程序段1*/
#elif 表達式
    /*程序段2*/
#elif 表達式
    /*程序段3*/
#else
    /*程序段4*/
#endif


免責聲明!

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



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