C語言 C預處理器

2021-10-04 18:52:40 字數 2448 閱讀 7542

c預處理器在程式執行之前檢視程式(故稱之為預處理器)。根據程式中的預處理指令,預處理器把符號縮寫替換成其表示內容

指令可以出現在原始檔的任何地方,從指令出現到檔案末尾該指令均有效。編寫程式時習慣利用其來定義明示常量(符號常量)

#define(邏輯行)由三部分組成,第一部分#define本身,第二部分稱為巨集,也就是選定的縮寫,有些巨集代表了特定值,稱為類物件巨集,c語言中還有類函式巨集,第三部分稱為替換列表(替換體)

從巨集變成最終替換文字的過程稱為巨集展開

#define _crt_secure_no_warnings

#include

#include

#define pi 3.14

#define m (a+b+c)/2

#define f(x) x*x+x/5

void

main()

巨集定義並不是值傳遞,而是傳遞形參字元
#include

#include

#define psqr(x) printf("the num : x = %d\n",x);

#define psqr_new(x) printf("the num : "#x" = %d\n",x);

intmain()

執行結果
the num : x =

45the num : y =

45

與#運算子類似,##運算子可用於類函式巨集的替換部分,並且,##還可用於物件巨集的替換部分,##運算子把兩個記號組合成乙個記號
#include

#include

#define name(n) x ## n

#define print_name(n) printf("x" #n " = %d\n",x ## n);

intmain()

運算結果
x1 =

45x2 =

56x3 =

78

這種操作為初始化變數以及輸出變數提供了一種新方式這些符號使得類函式巨集可以接受數量不定的引數

實現方法:

#include

#include

#define pr(...) printf(__va_args__)

intmain()

執行結果
hello world

hello! my name is lala,i am 18 years old

#include

//從配置目錄中找

#include

"stdio.h"

//從當前目錄開始找,沒有則在配置目錄中找

檔案包含允許巢狀:比如a檔案包含b檔案,b檔案包含c檔案,那麼最終b和c都被a所包含

#undef指令用於已經定義的#define指令

#define true 1

#undef true

#include

#ifdef true

//如果已經定義了巨集true,就執行

#include

#else

//如果沒有定義巨集,就執行

#define true 1

#include

#endif

//結束條件

#ifndef表示如果沒定義就執行

#if (常量表示式) 注意,是常量表示式,非變數僅當表示式為真,則編譯它與#endif之間的**

const

char name[30]

;//常量宣告

char ***[20]

;//變數宣告

#line用於重置__line__和__file__巨集報告的行號和檔名

#error用於讓預處理器發出一條錯誤資訊, 資訊包含指令中的文字

在現有的編譯器中,可以通過命令列引數或ide選單修改編譯器的一些設定。#pragma把編譯器指令放入原始碼中

#pragma c9x on

//上述指令表示令編譯器執行c9x標準

C語言 預處理器

如果想在下一行延續指令,則在當前行末尾使用 字元 帶引數的巨集 define max x,y x y x y define is even n n 2 0 則i max j k,m n if is even i i 將被替換為 i j k m n j k m n if i 2 0 i 巨集的替換列表...

C語言 預處理器

指令 描述 define 定義巨集 macro include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else if 的替代方案 endif 結束乙個if.else條件編譯塊...

C語言 預處理器

6 gcc編譯器檢視替換後的編碼 7 標頭檔案相互包含導致的重定義錯誤 指令 描述 define 定義巨集 include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else i...