C語言基礎(十) 預處理

2021-10-02 04:06:53 字數 3269 閱讀 7142

標頭檔案包含

條件編譯

作用:文字替換 提高**的可讀性

//示例 1

#define pi 3.1415926

帶參巨集
沒有引數型別 也沒有返回值型別

可以接受任意型別的引數 本質是替換

沒有任何檢查

//示例 2

#define add(a,b) a+b

在示例 2 中需要考慮優先順序問題

#include

#define add(a,b) a+b

intmain()

帶參巨集定義的時候加()

//示例 3

#define add(a,b) (a)+(b)

在某些特定的情況下加()也會出錯

//示例 4 

//c++面試題:#define min(a,b) ( (a) <= (b) ? (a) : (b) )

#include

#define min(a,b) ((a)<=(b)?(a):(b))

intmain()

解釋一下:

min

(*p++

,b)=((

*p++

)<

(b))?(

*p++):

(b)這個表示式會產生***,指標p會作二次++自增操作

開始p指向a,後來就不知道指向的是那個位址

需要注意的幾點:

特殊的巨集

編譯器內建的巨集定義

__line__

// 在源**中插入當前源**行號

__file__

// 在原始檔中插入當前源檔名

__date__

// 在原始檔中插入當前的編譯日期

__time__

// 在原始檔中插入當前編譯時間

這些巨集定義不僅可以幫助我們完成跨平台的原始碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的除錯資訊

//示例5

#include

intmain()

輸出結果:

__file__

:d:\test\test.c

__date__

:dec 22

2019

__time__:00

:37:15

__line__:7

press any key to continue

使用庫函式之前,應該用#include引入對應的標頭檔案。這種以#號開頭的命令稱為預處理命令。

#include<>

#include" "

區別:

先去系統目錄中去找標頭檔案 找不到 報錯

先去專案資料夾找標頭檔案 找不到 在去系統目錄找 都找不到 報錯

使用注意:

系統標頭檔案stdio.h用<>更快

自己編寫的標頭檔案用" "

條件編譯指令

說 明#if

如果條件為真,則執行相應操作

#elif

如果前面條件為假,而該條件為真,則執行相應操作

#else

如果前面條件均為假,則執行相應操作

#endif

結束相應的條件編譯指令

#ifdef

如果該巨集已定義,則執行相應操作

#ifndef

如果該巨集沒有定義,則執行相應操作

#if-#elif-#else-#endif

#if 條件表示式1

程式段 1

#elif 條件表示式2

程式段 2

#else

程式段3

#endif

寫注釋的時候可以這樣注釋,當條件為0時**段不編譯

#if 0

//**段

#endif

#ifndef - #define - #endif
#ifndef 識別符號

#define 識別符號

//…#endif

作用:防止標頭檔案重複包含

多檔案程式設計

檔案

#pragma once

//這個標頭檔案只包含一次

#ifndef _test_h_

//防止標頭檔案重複包含

#define _test_h_

//型別定義 函式宣告 巨集定義 ....

#include

#define n 10

struct student //結構體定義

;void

fun();

//函式宣告

#endif

同名.c檔案

#include

"test.h"

//包含同名.h

//函式定義.... 放同名.c檔案當中

void

fun(

)

#pragma

在多檔案程式設計,.**件開頭加上這段**防止標頭檔案重複包含

#pragma once
用n個位元組作為對齊單位 n是2的x次方 1 2 4 8 16

//示例 6

#include

typedef

struct test

test;

intmain()

根據對齊規則,輸出結果為:size:16

//示例 7

#include

#pragma pack(4)

//設定結構體對齊單位為4

typedef

struct test

test;

intmain()

由於設定了對齊單位,所以輸出結果為:size:12

C語言基礎(十) 預處理

預處理就是在編譯之前所做的事情,所以也叫預編譯,主要有巨集定義 檔案包含處理和條件編譯。巨集定義指令是指用乙個指定的識別符號代表乙個字串,可以減少程式中重複書寫某些字串的工作量,使用巨集可以達到 一改全改 的 規範。巨集定義主要分為不帶引數的巨集定義 和 帶引數的巨集定義。不帶引數的巨集定義 def...

C語言基礎 預處理

預處理 1.c語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋 比如之前使用的 include檔案包含指令 產生乙個新的源程式 這個過程稱為編譯預處理 之後再進行通常的編譯 2.為了區分預處理指令和一般的c語句,所有預處理指令都以符號 開頭,並且結尾不用分號 3.預處理指令可以出現在程式...

C語言基礎 預處理

預處理 預處理命令是由ansi c統一規定的,但是它們不是c語言本身的組成部分,不能直接對它們進行編譯 因為編譯程式不能識別它們 必須在對程式進行通常的編譯 包括詞法和語法分析 生成 優化等 之前,先對程式中這些特殊的命令進行 預處理 即根據預處理命令對程式作相應的處理 例如,若程式中用 defin...