《c語言從入門到精通》看書筆記 第13章 預處理

2021-07-07 08:27:46 字數 2878 閱讀 6453

1、巨集定義

巨集定義是預處理命令的一種,它提供了一種可以替換源**中字串的機制。

巨集定義指令#define用來定義乙個識別符號和乙個字串,一這個識別符號來代表這個字串,在程式中每次遇到該識別符號時就用所定義的字串替換它。巨集定義的作用相當於給指定的字串起乙個別名。

1)不帶引數的巨集定義一般形式如下:

#define     巨集名     字串

說明:(1)#表示這是一條預處理命令。

(2)巨集名是乙個識別符號,必須符合c語言識別符號規定

(3)字串這裡可以使常數、表示式、格式字串等。

(4) 

巨集定義不是c語句,不需要在行末加分號

(5)如果在串中含有巨集名,則不進行替換。

(6)如果串長於一行,可以在該行末尾用用一反斜槓「\」續航

(7)#define命令出現在程式中函式的外面,巨集名的有效範圍為定義命令之後到此原始檔結束

(8)可以用#undef命令終止巨集定義的作用域

(9)巨集定義用於預處理命令,它不同於定義的變數,只作字串替換,不分配記憶體空間。

2)帶引數的巨集定義

帶引數的巨集定義不是簡單的字串替換,還要進行引數替換,其一般形式如下:

#define     巨集名(參數列)字串

如:#define mix(a,b) ((a)*(b)+(b))

說明:(1)巨集定義時引數要加括號,如不加括號,則有時結果是正確的,有時結果是不正確的。

(2)巨集擴充套件必須使用括號來保護表示式中低優先順序的操作符,以確保呼叫時達到想要的結果。

2、#include 指令

在乙個原始檔中使用#include指令可以將另乙個原始檔的全部內容包含進來,也就是將另外的檔案包含到本檔案中。#include使編譯程式將另一原始檔嵌入帶有#include的原始檔,被讀入的原始檔必須用雙引號或尖括號括起來。例如:

#include"stdio.h"

#include

這兩種方式的區別:

用尖括號時,系統到存放c庫函式標頭檔案所在的目錄中尋找要包含的檔案,這是標準方式。用雙引號時,系統先在使用者當前目錄中尋找要包含的標頭檔案,若找不到,再到存放標頭檔案所在的目錄尋找要包含的檔案。通常情況下,

如果要呼叫庫函式用#include"_」如果要包含使用者自己編寫的檔案,一般用雙引號#include<_>。

經常用在檔案頭部的被包含的檔案稱為「標題檔案」或「頭部檔案」,一般以.h為字尾。

一般情況下將如下內容放到.h檔案中:

(1)巨集定義。

(2)結構、聯合和列舉宣告。

(3)typedef宣告

(4)外部函式宣告

(5)全域性變數宣告

3、條件編譯

(1)#if命令

#if的基本含義是:如果#if命令後的引數表示式為真,則編譯#if到#endif之間的程式段,否則跳過這段程式。

#if命令的一般形式為:

#if 常數表示式

語句段#endif

#elif指令用來建立一種「如果。。。或者如果。。」這樣階梯狀多重編譯操作選擇,這與多分支if語句中的else if類似。

#elif的一般形式如下:

#if 表示式

語句段#elif 表示式1

語句段#elif  表示式2

語句段。。。

#elif 表示式n

語句段#endif

(2)#ifdef及#ifndef命令

不需要判斷具體值,只需要知道這個符號常量是否被定義了,則採用#ifdef與#ifndef命令,分別表示「如果有定義」及「如果無定義」。

1)#ifdef的一般形式:

#ifdef 巨集替換名

語句段1

#else

語句段2

#endif

其含義是:如果巨集替換名已被定義過,則對「語句段」進行編譯;如果未定義#ifdef後面的巨集替換名,則對「語句段2」進行編譯。

2)#ifndef的一般形式:

#ifndef 巨集替換名

語句段1

#else

語句段2

#endif

其含義是:如果未定義#ifndef後面的紅替換名,則對「語句段1」進行編譯;如果定義#ifndef後面的巨集替換名,則對「語句段2」進行編譯。

(3)#undef命令

使用#undef命令可以刪除事先定義了的巨集定義。

#undef命令的一般形式如下:

#undef 巨集替換名

#undef的主要目的是將巨集名侷限在僅需要他們的**段中

(4)#line命令

#line命令改變_line_與_file_的內容,_line_存放當前編譯行的行號,_file_存放當前編譯的檔名。

#line命令的一般形式如下:

#line 行號["檔名"]

其中,行號為任一正整數,可選的檔名為任意有效檔案識別符號。行號為源程式中當前行號,檔名為原始檔的額名字。#line命令主要用於除錯及其他特殊應用。

(5)#pragma命令

#pragma命令的作用是設定編譯器的狀態,或者指示編譯器完成一些特定的動作。

#pragma命令的一般形式為:

#pragma 引數

引數可以為以下幾種:

1)message引數能夠在編譯資訊輸出視窗中輸出的相應資訊

2)code_seg引數設定程式中函式**存放的**段

3)once引數保證標頭檔案被編譯一次

(6)預定義巨集名

ansi標準說明了以下5個預定義巨集替換名

1)_line_:其含義是當前被編譯**的行號

2)_fine_:其含義是當前源程式的檔名稱

3)_date_:其含義是當前源程式的建立日期

4)_time_:其含義是當前源程式的建立時間

5)_stdc_:其含義是用來判斷當前編譯器是否為標準c,若其值為1則表示符合標準c,否則不是標準c.

《c語言從入門到精通》看書筆記 第9章 函式

1 函式的定義 函式頭 函式體,一般形式為 返回值型別 函式名 引數列表 2 函式的宣告 返回值型別 函式名 引數列表 3 返回語句 1 返回語句的作用 1 利用返回語句能立即從所在的函式中退出,即返回到呼叫的程式中去 2 返回語句能返回值。將函式值賦給呼叫的表示式中,當然有些函式沒用返回值。2 函...

《c語言從入門到精通》看書筆記 第10章 指標

1 位址與指標 變數的位址稱為該變數的 指標 如果乙個變數專門來存放另乙個變數的位址,它就是指標變數。在c語言中專門用來存放記憶體單元位址的變數型別即指標型別。2 指標變數 1 指標變數的一般形式 型別說明 變數名 其中 表示該變數是乙個指標變數,變數名即為定義的指標變數名,型別說明便是本指標變數所...

《c語言從入門到精通》看書筆記 第14章 檔案

1 檔案的基本操作 1 檔案指標 檔案指標是指向檔案有關資訊的指標,這些資訊包含檔名,狀態,和當前位置,他們儲存在乙個結構體變數中。在使用檔案時需要在記憶體中為其分配空間,用以存放檔案的基本資訊。該檔案是由系統定義的,c語言規定該型別為file型,宣告如下 typedef struct file 在...