當前位置:首頁 » 編程軟體 » 宏處理在哪個編譯階段

宏處理在哪個編譯階段

發布時間: 2023-04-02 00:49:38

Ⅰ 宏的展開是在編譯程序中展開的

是的,在編譯器的預處理過程中展開的

Ⅱ 宏是什麼意思啊,起到什麼作用啊

宏,就是「文本替換」,是在編譯預處理階段,宏根據一系列預定義的規則替換一定的文本模式。

以一樓朋友舉的例子而言,在預處理期,編譯器將你的程序代碼里所有出現「MAX」的地方,全都替換成「100」,但是,引號里的內容不換,例如:
printf("MAX");
這句里的MAX不會被替換,它執行的效果是在屏幕上列印出「MAX」三個字母而不是「100」。
for(int i=0; i<MAX; i++)
{
……
}
這空雹知裡面,「i<MAX」會替換成「i<100」

另外,宏還可以用來簡化一些復雜的操作,甚至是帶有參數,例如,在視頻游戲和動畫製作過程中,我們使用大量24位的點陣圖,但我們的顯卡往往對24位定址支持不夠好,都使用32位定址模式,那麼我們就要給點陣圖里的每一像素,添加8位ALPHA值,湊成32位,為和顯卡配合融洽。
我們習慣使用這樣的宏:
#define RGB32BIT(a,r,g,b) ((b)+((g)<<8)+((r)<<16)+((a)<<24))

你會覺得這跟函數有些類似,的確如此,但是斗消,它們很大的區別就是:(帶參數)的函數擁有類型檢查,而(帶參數)的宏沒有,就像我上面舉的例子,你必須確保a,r,g,b都是正整數,否則就會出錯,而使用函數則可以在編譯階段檢查出類型錯誤。不過卻要有時間和內存上的開肆纖銷,而宏沒有;所以各有利弊吧!

c語言編譯系統對宏替換的處理是在什麼時候進行的

是正式工作開始之前的准備工作,所以宏替換是在對程序編譯之前進行的。

宏替換是C/C++的預處理中的一部分,對於宏定義中的形參,在替換列表中,如果不是作為#或##的操作數,那麼將對應實參完全展開(相當於對實參進行求值),然後將替換列表中的形參替換掉,如果是#或##的操作數。

(3)宏處理在哪個編譯階段擴展閱讀:

宏的用途在於自動化頻繁使用的序列或者是獲得一種更強大的抽象能力。

計算機語言如C語言或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。

宏的行為如同是函數對自身程序文本的變形,並且可以應用全部語言來表達這種變形。一個C宏可以定義一段語法的替換,然而一個Lisp的宏卻可以控制一節代碼的計算。

Ⅳ C關於宏的計算

宏在預編譯的時候處理,包含#的指令,都是在預編譯的時候處理

相對於運行階段,你也可以認為是編譯階段。

它只是簡單的字元串替換,不是計算。

它不影響代碼的執行速度,但是可能會增加代碼的長度,影響最終生成的可執行文件的大小。

補充:
表達式(10/5)的計算,應該在運行的時候吧
無法通過編譯選項控制這個的。

Ⅳ 宏和函數的區別以及C語言的編譯鏈接過程

  1. 宏在編譯之前,需要進行預處理,將宏直接提換成宏定義的代碼,是直接替換,也就是說,在預處理之後,你再看代碼,發現宏定義已經被替換過來了,你看到是你定義之後的那一串代碼。

    而函數,在編譯之後,有一系列調用函數的過程,比如,傳參,壓棧等,這部分是編譯器所做的。

  2. C 語言編譯鏈接過程:

    test.c(原始代碼) --> 預處理 --> test.i(經過預處理的)--> 編譯 --> test.s(匯編代碼)--> 匯編 --> test.o(目標文件,其實這部分已經是單個文件的完整二進制文件了,只是還不能執行,如果不懂這句話,可以再問我,其實這部分知識,平時也很少遇到) --> 鏈接 --> test (可執行文件,比如一個程序由3個代碼文件共同生成,那麼就會有3個.o格式目標文件,鏈接是把多個目標文件真正的聯系在一起,比如a.o 中使用了 b.o中的一個函數,那麼它們兩個之間的地址是如何確定的(同理,可引申到使用函數庫的問題,使用printf函數,也是需要鏈接器進行確定printf函數地址,才能知道如何調用。)這個就是鏈接器的作用)

Ⅵ C++中,宏值到底是因編譯環境不同而變,還是因運行環境不同而變

這個與運行環境不同是可能不同的,編譯環境會根據你對編譯工程的設置(大部分時是默認設置,與當前操作系統、cpu特性等相匹配),對一些宏使用不同的定義。
比如VK_BACK在當前設置中也許是單位元組保存的,在某些定製的Windows操作系統中可能使用雙位元組表示的另一個符號,即它在鍵盤上與退格鍵位於同一位置。
嚴格的、可以移植的程序一般都建議使用定義好的宏,尤其這類容易隨運行環境發生重新定義的地方,要用一些宏替代具體數字。用宏替代數字也是比較好的程序設計風格,使數字得到運用解釋的同時提高了可讀性,並且利於進行統一的調整。

Ⅶ c語言中「宏」是個什麼東西 有什麼意義

宏定義的作用在預編譯階段,形如 #define A B 就是宏定義了,作用就是在預編譯階段將程序中的A全部視為B,舉個例子:
我們在程序最開始,聲明如下宏定義
#define pi 3.1415926
那麼在我們寫程序的時候,我們可以直接使用pi作為一個常量來使用,那麼當我們編譯程序的時候,編譯器會自動將程序中出現的pi替換成3.1415926

第二個例子,利用宏定義定義傻瓜函數
#define mul(A,B) A*B
那麼我們可以將mul()在程序中當成函數來使用,為什麼叫做傻瓜函數一會來解釋,使用方法
mul(3,5) 那麼這段代碼就相當於計算3*5=15
那麼當我們如下使用時就會出現問題
mul(3+2,3) 我們期待的結果是15,而實際結果是9,為什麼呢?因為在程序會如下轉換
3+2*3=3+6=9 這也就是為什麼我們管宏定義出來的函數叫傻瓜函數的原因了~~~

樓主呀~~~完全手寫,一定要好評呀!^_^

Ⅷ c語言,說宏展開是在編譯時進行的,啥意思啥叫編譯時進行的

c語言編寫出來的代碼叫源代碼,是供人看的,如果想讓機器執行,需要轉換成機器語言,這個轉換過程就叫編譯。
在c語言中定義的宏,在編譯時,會展開(或叫替換)為實際的語句,如:
#define MAX 100
void main()
{
int a=MAX ;
printf("a=%d\n", a );
}
這里MAX是個宏,當編譯時,這段代碼就會變成:
void main()
{
int a=100; //這里的MAX會變成100
printf("a=%d\n", a );
}
這就是宏展開、宏替換,然後編譯器,按這樣子的源代碼進行編譯,生成執行程序

Ⅸ C語言預處理編譯鏈接各個階段錯誤,分階段的說一下

預處理階段主要是處理宏指令,像什麼#include指令、#define指令還有條件編譯指令等。
編譯階段主要是檢查C語言程序的語法錯誤,即編寫的代碼是否符合C語言規則,編譯是以.c源文件為單位編譯成.obj文件(或者是.o文件)。
鏈接階段,就是把相關的.obj文件、所需的庫文件等組合成一個可執行的文件。如果缺少相關所需文件,就會鏈接報錯。
指針異常,數組下標越界這些錯誤屬於語義錯誤,這個只能在執行的時候才能發現問題,這些也叫運行時錯誤。

Ⅹ const、define、static、extern

extern用於變數的聲明,告訴編譯器:已經存在一個全局變數,但是不在當前的編譯單元內,需要連接的時候在其他編譯單元中尋找。

修改變數作用域為當前編譯單元,變數生命周期不變;
避免重復定義全局變數
2.2. 修飾局部變數 -
修改變數的生命周期為整個工程周期,變數作用域不變

const修飾右邊的變數,用來限制變數為只讀屬性。

在程序的預編譯階段進行替換處理。

區別:
1.define宏是在預處理階段展開。
const常量是編譯運行階段使用。
2.define不做檢查,不會報編譯錯誤,只是替換。const會編譯檢查,會報編譯錯誤
3.define在展開的時候才分配內存,展開幾次分配幾次內存。const在定義的時候會分配一次內存到靜態區,使用時不重復分配
4.define可以定義一些簡單的運算函數神吵

聲明一個只讀的靜態變數

在多個文件中經常使用的同一個全局變數。
使用場景:
1、.h文件中聲辯瞎薯明

2、.m文件中賦值

3、pch文攜者件中導入頭文件即可在整個項目中訪問

這里直接訪問即可,都不用放到.pch文件中,因為默認許可權是internal
public : 最大許可權,可以在當前framework和其他framwork中訪問;
internal : 默認許可權,可以在當前framework中隨意訪問;
private : 私有許可權,只能在當前文件中訪問;

一般常量的話,都用extern const 來代替define。
因為一旦定義#define的方式,整個工程將被重新編譯,這樣帶來的時間浪費可想而知
當然了很多情況還是代替不了的,一般定義常量的時候是應該使用這種方式來定義,不過也只是常量宏不被推薦,但是類函數宏用的還是很方便的,
const、#define的優缺點
編譯器可以對const進行類型安全檢查。而對#define只進行字元替換,沒有類型安全檢查,並且在字元替換可能會產生意料不到的錯誤。

這種情況還可能出現以下錯誤
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要 NSString* 的地方使用了 const NSString*

.h中 extern const NSString* 替換為 extern NSString* const
.m中 const NSString* 替換為 NSString* const
解釋:前者相當於指針本身不可修改,後者表示指針指向的內容不可修改,兩者的作用都是使字元串只可讀不可寫。

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91