一. 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...