C語言學習筆記 - 預處理器

C預處理器

C 預處理器是一個文本替換工具而已,它們會指示編譯器在實際編譯之前完成所需的預處理。所有的預處理器命令都是以井號(#)開頭。

指令 描述
#define 定義宏
#include 包含一個源代碼文件
#undef 取消已定義的宏
#ifdef 如果宏已經定義,則返回真
#ifndef 如果宏沒有定義,則返回真
#if 如果給定條件爲真,則編譯下面代碼
#else #if 的替代方案
#elif 如果前面的 #if 給定條件不爲真,當前條件爲真,則編譯下面代碼
#endif 結束一個 #if……#else 條件編譯塊
#error 當遇到標準錯誤時,輸出錯誤消息
#pragma 使用標準化方法,向編譯器發佈特殊的命令到編譯器中

預處理器實例

#define LENGTH 20

這個指令代表所有LENGTH替換成20,使用#define定義常量增強可閱讀性。

#include <myheader.h>

這個指令告訴程序從本地目錄中獲取myheader.h,並添加內容至當前文件中。

#undef  LENGTH
#define LENGTH 42

這個指令告訴程序取消已定義的LENGTH,並重新定義爲42。

#ifndef WIDTH
   #define WIDTH 30
#endif

這個指令告訴程序當 WIDTH 未定義時,才定義 WIDTH。

#ifdef DEBUG
   /* Your debugging statements here */
#endif

這個指令告訴程序如果定義了 DEBUG,則執行處理語句。

預定義宏

ANSI C 定義了許多宏。在編程中您可以使用這些宏,但是不能直接修改這些預定義的宏。

描述
__DATE__ 當前日期,一個以 “MMM DD YYYY” 格式表示的字符常量。
__TIME__ 當前時間,一個以 “HH:MM:SS” 格式表示的字符常量。
__FILE__ 這會包含當前文件名,一個字符串常量。
__LINE__ 這會包含當前行號,一個十進制常量。
__STDC__ 當編譯器以 ANSI 標準編譯時,則定義爲 1。
#include <stdio.h>

main()
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );

}

打印結果:

File :main.c
Date :Apr  7 2018
Time :23:14:55
Line :104
ANSI :1

預處理器運算符

  • 宏延續運算符(\)

一個宏通常寫在一個單行上。但是如果宏太長,一個單行容納不下,則使用宏延續運算符(\)。

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")
  • 字符串常量化運算符(#)

在宏定義中,當需要把一個宏的參數轉換爲字符串常量時,則使用字符串常量化運算符(#)。在宏中使用的該運算符有一個特定的參數或參數列表。

#include <stdio.h>

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

int main(void)
{
   message_for(Carole, Debra);
   return 0;
}
  • 標記粘貼運算符(##)

宏定義內的標記粘貼運算符(##)會合並兩個參數。它允許在宏定義中兩個獨立的標記被合併爲一個標記。

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;

   tokenpaster(34);
   return 0;
}
  • defined() 運算符

預處理器 defined 運算符是用在常量表達式中的,用來確定一個標識符是否已經使用 #define 定義過。如果指定的標識符已定義,則值爲真(非零)。如果指定的標識符未定義,則值爲假(零)。

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

參數化的宏

在使用帶有參數的宏之前,必須使用 #define 指令定義。參數列表是括在圓括號內,且必須緊跟在宏名稱的後邊。宏名稱和左圓括號之間不允許有空格。

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

注意:

使用#define含參時,參數括號很重要

#include <stdio.h>

#define square(x) ((x) * (x))

#define square_1(x) (x * x)

int main(void)
{
   printf("square 5+4 is %d\n", square(5+4));  
   printf("square_1 5+4 is %d\n", square(5+4)); 
   return 0;
}

輸出結果爲:

square 5+4 is 81
square_1 5+4 is 29

原因:

square   等價於   (5+4)*(5+4)=81
square_1 等價於   5+4*5+4=29
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章