當前位置:首頁 » 編程軟體 » 預編譯函數宏

預編譯函數宏

發布時間: 2022-04-28 01:38:38

『壹』 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語言頭文件中,為什麼定義了函數還要定義這些宏呢這個有什麼用以嗎

當出於某些原因需要對數據做出修改,只要修改宏定義就行了,而不必在整個源文件中修改。
而至於某些人說的可以加快CPU處理速度、宏運行的速度更快,我並不認同。
編譯器對於源文件首先是進行宏替換,然後再編譯連接,不管是對於編譯後得到程序的運行效率還是編譯器編譯速度都沒有提升

『叄』 關於C語言中函數與定義的類似於函數的宏的區別

不僅僅是函數,定義和宏的主要區別在預編譯的時候,定義在預編譯的時候的主要操作時分配空間或內存,宏是進行了替換。比如#define n1000 ,預編譯的時候所有的n此時全部換成了1000,若int n =1000;只是這個n是1000,如果後邊還有用到的n,此時還可以理解是n,而不是1000

『肆』 c語言中的「宏」是指什麼

是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。

「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
計算機語言如C語言或 匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。

在Objective-C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字元串去替換,這稱為宏替換或宏展開。

宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。在Objective-C語言中,宏分為有參數和無參數兩種。

(4)預編譯函數宏擴展閱讀

A類宏是用G65 Hxx P#xx Q#xx R#xx或G65
Hxx P#xx Qxx
Rxx格式輸入的,xx的意思就是數值,是以um級的量輸入的,比如你輸入100那就是0.1MM #xx就是變數號,變數號就是把數值代入到一個固定的地址中,固定的地址就是變數。

一般OTD系有#0~#100~#149~#500~#531.關閉電源時變數#100~#149被初始化成「空」,而變數#500~#531保持數據。我們如果說#100=30那麼現在#100地址內的數據就是30了。

B類宏能完成某一功能的一系列指令像子程序那樣存入存儲器,用戶可以設定M、S、T、G代碼調用它們,使用時只需給出這個指令代碼就能執行其功能,也可以像調用子程序一樣使用。

『伍』 宏函數的定義

【定義】:
宏(計算機術語):
計算機科學里的宏(Macro),是一種批量批處理的稱謂。一般說來,宏是一種規則或模式,或稱語法替換 ,用於說明某一特定輸入(通常是字元串)如何根據預定義的規則轉換成對應的輸出(通常也是字元串)。這種替換在預編譯時進行,稱作宏展開。
函數(計算機術語):
為實現某一特殊目的單獨編寫存放的小程序塊,也可稱為方法。

【糾錯】:
宏是宏,函數是函數,這是兩個不同的概念,一般我們只說宏就可以了。

『陸』 在C語言中「宏是什麼意思」

宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯

宏定義又稱為宏代換、宏替換,簡稱「宏」。
格式:
#define 標識符 字元串
其中的標識符就是所謂的符號常量,也稱為「宏名」。
預處理(預編譯)工作也叫做宏展開:將宏名替換為字元串。
掌握"宏"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例:
#define PI 3.1415926
把程序中出現的PI全部換成3.1415926
說明:
(1)宏名一般用大寫
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)宏定義末尾不加分號;
(5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。
(6)可以用#undef命令終止宏定義的作用域
(7)宏定義不可以嵌套
(8)字元串" "中永遠不包含宏
(9)宏定義不分配內存,變數定義分配內存。
(10)宏定義不存在類型問題,它的參數也是無類型的。

『柒』 什麼是預編譯,何時需要預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作

預編譯又稱為預處理,是做些代碼文本的替換工作

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令

預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。

注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。

(2)#define指令

該指令有三種用法:

第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;

第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);

第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。

第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識) //如果定義了標識

要執行的指令

#else

要執行的指令

#endif

在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:

#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,

//每個頭文件的標識符都不應相同。

//起標識符的常見方法是若頭文件名為"abc.h"

//則標識為"abc_h"

#define XXX

真正的內容,如函數聲明之類

#endif

『捌』 宏和函數的區別是什麼

1/ 宏只是預編譯時一一展開,沒有類型檢查,可能產生二義性;同時宏寫的函數不容易直觀看懂。
#define MAX(a,b) ( (a)<(b)?(b):(a) )

2/ 內聯函數並不總是被內聯,inline對於編譯器不是強制性的,縞譯器根椐內聯函數代碼行數決定是否參於內聯,從編譯後生成的目標代碼大小就能看出到底編譯器是否真的內聯了,調用1次和調用2次目標代碼空間是不一樣的。
template<typename T>
inline void Count( const T& a, const T& b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

3/ 那麼我們就強置內聯好了,編譯時會出現什麼問題呢?
template<typename T>
inline __attribute__((always_inline)) void Count( const T& a,const T& b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}
Test.h:25: sorry, unimplemented: inlining failed in call to 'void Count(const T&, const T&) [with T = int]': function body not available
// 說明模板不能參於強制內聯

4/ 去掉模板聲明,採取強制內聯是有效果的,並且隨著調用次數的增加目標代碼是不斷增大的,說明強制內聯起作用了,那它真達到宏的作用了嗎?
inline __attribute__((always_inline)) void Count( int a,int b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

5/ 那我們改一下再和宏比較, 調用強制Count版本兩次,沒有報變數c被重復定義,不知道為什麼? 難道可以獲取到每一次調用Count的函數地址嗎(實際GDB時就沒有Count函數的概念)? 如果調用宏版本的Count,是會報變數c被重復定義,簡單替換啦.
inline __attribute__((always_inline)) void Count( int a,int b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

#define Count(a,b) \
printf("always_inline?"); \
printf("always_inline?"); \
printf("always_inline?"); \
int c = a + b

熱點內容
電信路由器密碼設置無線路由器怎麼設置密碼 發布:2024-05-18 10:55:00 瀏覽:647
安卓系統是屬於哪個國家的手機 發布:2024-05-18 10:41:41 瀏覽:99
linux運維前景 發布:2024-05-18 10:24:44 瀏覽:658
c語言crc演算法 發布:2024-05-18 09:59:03 瀏覽:644
linuxc編程視頻 發布:2024-05-18 09:55:58 瀏覽:273
如何建造一個好的伺服器 發布:2024-05-18 09:54:30 瀏覽:524
編譯原理中的左結合 發布:2024-05-18 09:42:00 瀏覽:26
怎樣加密路由器 發布:2024-05-18 09:41:55 瀏覽:605
百度雲不能上傳視頻了 發布:2024-05-18 09:41:08 瀏覽:148
mac適合買大存儲 發布:2024-05-18 08:30:08 瀏覽:583