巨集定義與巨集替換

2021-07-24 21:18:08 字數 2840 閱讀 9293

一. c /c++語言中使用巨集的主要目的主要有 3 個:

1. 提高**的可讀性;

把用到的常量定義成有意義的名字;

2. 無需函式呼叫,執行效率高;

對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單的操作,則效率低下。利用巨集來代替簡單的操作,則可以提高程式的執行效率。

3. 可維護行好;

對於用得比較多的常量或者簡單操作,一旦需要修改,則只需要修改巨集定義處,不需要逐條修改。

二. 巨集定義命令 : #define

1 . #define命令主要是將乙個識別符號替換為乙個字串,該識別符號稱為巨集名,被替換的字串被稱為替換文字。

2. 用法:

主要有兩種格式,乙個是簡單的巨集定義,另乙個是帶引數的巨集定義;

簡單的巨集定義: #define 《巨集名》 《替換文字》

例: #define pi 3.1415

帶引數的巨集定義:#define 《巨集名》 (《引數列表》) 《巨集體》

例: #define a(x) x

三. 巨集替換

當巨集定義好後,在程式中使用巨集名就稱為巨集替換。當程式進行編譯時實際上經過了預處理,編譯(生成中間**,即從源程式翻譯為中間語言,即彙編),彙編(將組合語言翻譯成機器**,即二進位制**),鏈結(將目標檔案生成 .exe檔案)。巨集替換就發生在預處理(也叫預編譯)階段,也就是說在編譯之前(生成二進位制檔案之前)就已經完成了文字的替換工作。

關於預處理主要完成的工作是:

1.檔案包含,將#include包含的檔案找到,並在#include處進行展開;

2.條件編譯,根據#if #ifdef 等編譯命令及其後的條件,將源程式的一部分包含進來或排除在外,通常把排除在外的語句換成空行。

3.巨集展開,將程式中所用到的巨集展開成巨集定義的替換文字。經過巨集展開之後的程式與之前的源程式的只是簡單的文字替換,並無計算功能。這是理解巨集的要點。

四. 使用巨集要注意的問題

1.使用簡單巨集出現的問題

#include

#define n 2+2

int main()

2.使用帶引數的巨集出現的問題

#include

#define product(a) a*a

int main()

在vs帶的編譯器下,程式輸出結果 i = 6 j =16 i = 8 j = 64

四. 結語

本文主要講了巨集定義的用法以及要使用時要注意的東西,同時注意到巨集替換在預處理階段完成,只是進行文字替換。

五. 常用的巨集定義

1 防止乙個標頭檔案被重複包含

#ifndef bodydef_h 

#define bodydef_h

//標頭檔案內容

#endif

2 得到指定位址上的乙個位元組或字

#define mem_b( x ) ( *( (byte *) (x) ) ) 

#define mem_w( x ) ( *( (word *) (x) ) )

3 得到乙個field在結構體(struct)中的偏移量

#define offsetof( type, field ) ( (size_t) &(( type *) 0)-> field )
4 得到乙個結構體中field所占用的位元組數

#define fsiz( type, field ) sizeof( ((type *) 0)->field )
5 得到乙個變數的位址(word寬度)

#define b_ptr( var ) ( (byte *) (void

*) &(var) )

#define w_ptr( var ) ( (word *) (void

*) &(var) )

6 將乙個字母轉換為大寫

#define upcase( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )
7 判斷字元是不是10進值的數字

#define decchk( c ) ((c) >= ''

0'' && (c) <= ''

9'')

8 判斷字元是不是16進值的數字

#define hexchk( c ) ( ((c) >= ''

0'' && (c) <= ''

9'') ||((c) >= ''a'' && (c) <= ''f'') ||((c) >= ''a'' && (c) <= ''f'') )

9 防止溢位的乙個方法

#define inc_sat( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
10 返回陣列元素的個數

#define arr_size( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
11 使用一些巨集跟蹤除錯

ansi標準說明了五個預定義的巨集名。它們是

_line_ /*(兩個下劃線),對應%d*/

_file_ /*對應%s*/

_date_ /*對應%s*/

_time_ /*對應%s*/

摘自:

巨集定義與巨集替換

一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...

python巨集替換 簡單的巨集替換

簡單的巨集替換 1.巨集定義必須寫在第一次使用該巨集定義的 之前 2.巨集定義不是以分號結束的 3.define string1 string2 之間至少要有乙個空格 4.string 1稱為巨集,string2 稱為巨集擴充套件 5.巨集名用大寫的字母表示是乙個習慣 6.使用巨集的好處 a 簡化程...

abs int 巨集定義 巨集定義和巨集方法

巨集定義和巨集方法 定義機型 define is iphone5 uiscreen instancesrespondtoselector selector currentmode cgsizeequaltosize cgsizemake 640,1136 uiscreen mainscreen cu...