本文目錄一覽:
C語言中怎樣修改宏定義呢
什麼意思?是在定義宏後的程序代碼中改,還是在編輯宏定義的時候該?
如果是前者,宏定義是在預編譯時是就決定的,在程序運行時是不能改的;如果是後者,直接改就行了。
在C語言中「宏是什麼意思」
定義的意思
在C語言中的宏定義就是定義外部變數 內部函數使用exiterm來調用
如:exiterm char c1,c2;
C語言中的宏定義的字是:define
C語言中的define宏定義有帶參數的和不帶參數兩中形式
不帶參格式是:#define 宏名 字元串
帶參格式是:#define 宏名(參數1,參數2,…) 字元串
在C語言里宏定義只用來做的宏名替換,而不做語法檢查的,因而它不是C語句,所以在宏定義的時候不需要在後面加”;”
宏也在C里也叫預處理命令,因為宏是在程序編譯前先進行字元替換的,所以叫預處理.在C里還有其它的預處理命令如:
#define
#undef
#ifdef
等等
c語言中的「宏」是指什麼?
宏是一種預處理指令,它提供了一種機制,可以用來替換源代碼中的字元串。
1、條件編譯:
C語言中,預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,並對源代碼進行相應的轉換,預處理過程還會刪除程序中的注釋和多餘的空白符號。
預處理指令是以#開頭的代碼行,#必須是該行除了空白字元外的第一個字元。#後是指令關鍵字,在#和指令關鍵字之間允許存在若干空白字元。
使用宏進行條件編譯的用法與使用宏防止多重引用類似。示例如下:
使用條件編譯,方便程序員在調試程序的過程中,執行一些在程序發布後並不需要執行的指令。只要在需要調試的代碼前加上_DEBUG的定義,就可以在調試程序的過程中輸出調試信息。
這樣方便查看程序在運行過程中有沒有出現錯誤,定位錯誤出現的地方。而在程序發布之前,取消_DEBUG的定義就可以不再執行調試代碼。
2、宏函數:
函數的調用是需要一定的時間和空間代價的。因為系統在調用函數時,需要保留”現場”,即將程序要執行的指令的下一條指令的位置壓入棧,然後轉入調用函數去執行,調用完函數後再返回主調函數,恢復”現場”,返回到棧里保存的的下一條指令的位置繼續執行。
所以函數的調用需要額外的時間和空間代價。
而宏函數則不存在上述問題,宏函數在預編譯時,同函數定義的代碼來替換函數名,將函數代碼段嵌入到當前程序,不會產生函數調用。
所以會省去普通函數保留現場恢復現場的時間,但因為要將定義的函數體嵌入到當前程序,所以不可避免的會佔用額外的存儲空間。
在頻繁調用同一個宏的時候,該現象尤其明顯。宏函數的示例定義如下:
#define MAX(a,b) ((a)(b)?(b):(a))
宏函數的優點在於避免函數調用,提高程序效率。
同時需要注意的是inline標識符。inline也將函數定義為內聯的。但是使用內聯函數需要注意的是:函數體必須十分簡單,不能含有循環、條件、選擇等複雜結構,否則就不能作為內聯函數了。
事實上,有時候即便你沒有將函數指定為內聯函數,編譯器也會將一些簡單的函數作為內聯函數處理,而對於一些複雜的函數,即使聲明為內聯函數,編譯器也不會理會的。
inline函數的瓶頸就在於此,使用inline標識符將函數聲明為內聯的,但這只是一種提示,到底編譯器有沒有優化還依賴於編譯器的實現,而使用宏函數則完全由代碼本身控制。
但在使用宏函數的時候,需要明確的是宏函數只是簡單的替換,需要注意括弧的使用。
擴展資料:
宏的更多規則特性:
(1)宏名一般用大寫。
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義。
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)宏定義末尾不加分號。
(5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。
(6)可以用#undef命令終止宏定義的作用域。
(7)宏定義不可以嵌套。
(8)字元串” “中永遠不包含宏。
(9)宏定義不分配內存,變數定義分配內存。
(10)宏定義不存在類型問題,它的參數也是無類型的。
參考資料:
百度百科–宏定義
10. C語言的編譯系統對宏命令的處理是( )。
前言:宏實質就是編譯器在對代碼進行編譯之前進行的一個「查找替換」工作,就跟你在處理文檔時用WPS/WORD/記事本等進行「查找替換」操作一樣。
C語言的編譯系統對宏命令的處理是()
A。在程序運行時進行的
B。在對源程序中其他成分正式編譯之前進行的
C。在程序連續時進行的
D。和C程序中的其他語句同時進行編譯
答:選B。在對源程序中其他成分正式編譯之前進行的
2,
#define N 2 /* 在預編譯時將用下面代碼中N替換成2 */
#define M N+1 /* 在預編譯時將M替換成N+1(即2+1,N會再被替換成2)*/
#define NUM 2*M+1 /* 如上:在預編譯時NUM替換成2*M+1,即2*N+1+1,即2*2+1+1*/
main()
{int i;
for(i=1;i=NUM;i++)printf(“%d\n”,i);
/*
* 如上所述,上句展開為:for(i=1;i=2*2+1+1;i++)printf(“%d\n”,i);
* 所以:循環將執行6次
*/
}
/* 切記注意:每一個宏百進行替換時只是替換「正文」中的內容,而不包括預編譯語句的內容, 否則就會像不少人理解的那樣,錯誤地認為第2個題中的循環將執行7次 */
C語言的編譯系統對宏命令的處理是
前言:宏實質就是編譯器在對代碼進行編譯之前進行的一個「查找替換」工作,就跟你在處理文檔時用wps/word/記事本等進行「查找替換」操作一樣。
c語言的編譯系統對宏命令的處理是()
a。在程序運行時進行的
b。在對源程序中其他成分正式編譯之前進行的
c。在程序連續時進行的
d。和c程序中的其他語句同時進行編譯
答:選b。在對源程序中其他成分正式編譯之前進行的
2,
#define
n
2
/*
在預編譯時將用下面代碼中n替換成2
*/
#define
m
n+1
/*
在預編譯時將m替換成n+1(即2+1,n會再被替換成2)*/
#define
num
2*m+1
/*
如上:在預編譯時num替換成2*m+1,即2*n+1+1,即2*2+1+1*/
main()
{int
i;
for(i=1;i=num;i++)printf(“%d\n”,i);
/*
*
如上所述,上句展開為:for(i=1;i=2*2+1+1;i++)printf(“%d\n”,i);
*
所以:循環將執行6次
*/
}
/*
切記注意:每一個宏百進行替換時只是替換「正文」中的內容,而不包括預編譯語句的內容,
否則就會像不少人理解的那樣,錯誤地認為第2個題中的循環將執行7次
*/
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/201081.html