国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)

這篇具有很好參考價(jià)值的文章主要介紹了【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

主頁(yè):114514的代碼大冒

qq:2188956112(歡迎小伙伴呀hi?(。???。)??)

Gitee:莊嘉豪 (zhuang-jiahaoxxx) - Gitee.com

文章目錄

目錄

文章目錄

前言

2.5帶副作用的宏參數(shù)

2.6宏和函數(shù)的對(duì)比

3#undef

?編輯

4 命令行定義

5 條件編譯

6 文件包含

總結(jié)



前言

咱們書接上回


2.5帶副作用的宏參數(shù)

先來(lái)看一段代碼

#define MAX(x,y) ((x)>(y)?(x):(y))




int main()
{
	int a = 4;
	int b = 6;
	int m = MAX(a++, b++);
	printf("%d\n", m); 
	printf("a=%d b=%d\n", a, b);

	return 0;
}

這個(gè)結(jié)果是什么呢?

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?為什么?

我們一樣要考上文中的“宏是一種替換”的概念,先做一下替換然后我們來(lái)解析一下

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?

當(dāng)宏參數(shù)在宏的定義中出現(xiàn)超過(guò)一次的時(shí)候,如果參數(shù)帶有副作用,那么你在使用這個(gè)宏的時(shí)候就可能出現(xiàn)危險(xiǎn),導(dǎo)致不可預(yù)測(cè)的后果。副作用就是表達(dá)式求值的時(shí)候出現(xiàn)的永久性效果。
x+1;//不帶副作用
x++;//帶有副作用

但是在這里這種情況,函數(shù)就不會(huì)發(fā)生類似問(wèn)題

這里我提供了測(cè)試代碼,讀者可自取


#define MAX(x,y) ((x)>(y)?(x):(y))

int Max(int x, int y)
{
	return x > y ? x : y;

}


int main()
{
	//int m = MAX(2, 3);
	//printf("%d\n", m);
	int a = 4;
	int b = 6;
	int m = MAX(a++, b++);
	//int m = Max(a++, b++);
	printf("%d\n", m); 
	// m = 7
	printf("a=%d b=%d\n", a, b);
	

	return 0;
}

2.6宏和函數(shù)的對(duì)比

函數(shù)的反匯編

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

宏的反匯編

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表?c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

宏明顯要快不少嘛

宏通常被應(yīng)用于執(zhí)行簡(jiǎn)單的運(yùn)算。
比如在兩個(gè)數(shù)中找出較大的一個(gè)。
宏的優(yōu)點(diǎn):
1. 用于調(diào)用函數(shù)和從函數(shù)返回的代碼可能比實(shí)際執(zhí)行這個(gè)小型計(jì)算工作所需要的時(shí)間更多。
所以宏比函數(shù)在程序的規(guī)模和速度方面更勝一籌 。
2. 更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。
所以函數(shù)只能在類型合適的表達(dá)式上使用。反之這個(gè)宏怎可以適用于整形、長(zhǎng)整型、浮點(diǎn)型等可以用于> 來(lái)比較的類型。
宏是類型無(wú)關(guān)的 。

?宏的缺點(diǎn)

當(dāng)然和函數(shù)相比宏也有劣勢(shì)的地方:
1. 每次使用宏的時(shí)候,一份宏定義的代碼將插入到程序中。除非宏比較短,否則可能大幅度增加程序的長(zhǎng)度。
2. 宏是沒(méi)法調(diào)試的。
3. 宏由于類型無(wú)關(guān),也就不夠嚴(yán)謹(jǐn)。
4. 宏可能會(huì)帶來(lái)運(yùn)算符優(yōu)先級(jí)的問(wèn)題,導(dǎo)致程容易出現(xiàn)錯(cuò)。

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?宏沒(méi)有類型,如上圖所示,函數(shù)只能進(jìn)行固定類型數(shù)據(jù)的操作,而宏卻可以忽視這一細(xì)節(jié)

但是對(duì)應(yīng)的,宏是一種替換,也就是說(shuō),他會(huì)把定義的內(nèi)容替換到正文代碼中,造成代碼超度變長(zhǎng)

另外就是像上文所說(shuō)的那種“副作用”,足以看出宏在調(diào)試時(shí)的問(wèn)題是比較大的,

因?yàn)椤澳憧吹降牟⒎悄憧吹降模ê晏鎿Q的關(guān)系)”

所以總的說(shuō)來(lái),宏有著優(yōu)點(diǎn)也有著缺點(diǎn)

具體使用函數(shù)還是宏,要根據(jù)實(shí)際情況

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?
#define 定義宏
函數(shù)
長(zhǎng)
每次使用時(shí),宏代碼都會(huì)被插入到程序中。除了非常
小的宏之外,程序的長(zhǎng)度會(huì)大幅度增長(zhǎng)
函數(shù)代碼只出現(xiàn)于一個(gè)地方;每
次使用這個(gè)函數(shù)時(shí),都調(diào)用那個(gè)
地方的同一份代碼
執(zhí)
更快
存在函數(shù)的調(diào)用和返回的額外開 銷,所以相對(duì)慢一些
優(yōu)
級(jí)
宏參數(shù)的求值是在所有周圍表達(dá)式的上下文環(huán)境里,
除非加上括號(hào),否則鄰近操作符的優(yōu)先級(jí)可能會(huì)產(chǎn)生
不可預(yù)料的后果,所以建議宏在書寫的時(shí)候多些括
號(hào)。
函數(shù)參數(shù)只在函數(shù)調(diào)用的時(shí)候求
值一次,它的結(jié)果值傳遞給函
數(shù)。表達(dá)式的求值結(jié)果更容易預(yù)測(cè)
數(shù)
參數(shù)可能被替換到宏體中的多個(gè)位置,所以帶有副作 用的參數(shù)求值可能會(huì)產(chǎn)生不可預(yù)料
的結(jié)果
函數(shù)參數(shù)只在傳參的時(shí)候求值一次,結(jié)果更容易控制。
數(shù)
宏的參數(shù)與類型無(wú)關(guān),只要對(duì)參數(shù)的操作是合法的, 它就可以使用于任何參數(shù)類型。
函數(shù)的參數(shù)是與類型有關(guān)的,如果參數(shù)的類型不同,就需要不同的函數(shù),即使他們執(zhí)行的任務(wù)是相同的。
調(diào)
宏是不方便調(diào)試的
函數(shù)是可以逐語(yǔ)句調(diào)試的
宏是不能遞歸的
函數(shù)是可以遞歸的

2.7 命名約定
一般來(lái)講函數(shù)的宏的使用語(yǔ)法很相似。所以語(yǔ)言本身沒(méi)法幫我們區(qū)分二者。
那我們平時(shí)的一個(gè)習(xí)慣是:
把宏名全部大寫
函數(shù)名不要全部大寫

3#undef

這條指令用于移除一個(gè)宏定義。
#undef NAME
// 如果現(xiàn)存的一個(gè)名字需要被重新定義,那么它的舊名字首先要被移除。

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?

4 命令行定義

許多 C 的編譯器提供了一種能力,允許在命令行中定義符號(hào)。用于啟動(dòng)編譯過(guò)程。
例如:當(dāng)我們根據(jù)同一個(gè)源文件要編譯出一個(gè)程序的不同版本的時(shí)候,這個(gè)特性有點(diǎn)用處。(假定某個(gè)程序中聲明了一個(gè)某個(gè)長(zhǎng)度的數(shù)組,如果機(jī)器內(nèi)存有限,我們需要一個(gè)很小的數(shù)組,但是另外一個(gè)機(jī)器內(nèi)存大些,我們需要一個(gè)數(shù)組能夠大些。)
#include <stdio.h>
int main()
{
 ? ?int array [ARRAY_SIZE];
 ? ?int i = 0;
 ? ?for(i = 0; i< ARRAY_SIZE; i ++)
 ? {
 ? ? ? ?array[i] = i;
 ? }
 ? ?for(i = 0; i< ARRAY_SIZE; i ++)
 ? {
 ? ? ? ?printf("%d " ,array[i]);
 ? }
 ? ?printf("\n" );
 ? ?return 0;
}
編譯指令:
//linux 環(huán)境演示
gcc -D ARRAY_SIZE=10 programe.c

5 條件編譯

在編譯一個(gè)程序的時(shí)候我們?nèi)绻獙⒁粭l語(yǔ)句(一組語(yǔ)句)編譯或者放棄是很方便的。因?yàn)槲覀冇袟l件編譯指令。

比如說(shuō):

調(diào)試性的代碼,刪除可惜,保留又礙事,所以我們可以選擇性的編譯

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?------------------------------條件編譯的“條件”不可以是變量------------------------------------------------

因?yàn)闂l件編譯中的條件在預(yù)處理階段就已經(jīng)處理了,而預(yù)處理階段不處理變量

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?使用方法再舉例

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?關(guān)系可以向C語(yǔ)言中的“if.....else”語(yǔ)句考慮

更多例子

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?

6 文件包含

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?這個(gè)多次包含編譯器是不會(huì)進(jìn)行報(bào)錯(cuò)的,但是這個(gè)東西意味著程序?qū)⒍啻握{(diào)用同一段代碼

這顯然是多余的,ok,看起來(lái)似乎這個(gè)多次包含同一文件的錯(cuò)誤對(duì)于個(gè)人來(lái)講很容易規(guī)避

但是如果是

?下圖這般

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?如何避免呢?

答:條件編譯

c 語(yǔ)言宏編程 類型處理,c語(yǔ)言-倒敘,數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,c++,鏈表

?下面這個(gè)放在第一行也具有相同作用

#pragma once//這個(gè)也是OK的

?#include <filename.h> #include "filename.h"有什么區(qū)別?

答:如果使用尖括號(hào),那么程序?qū)⒅苯釉谙到y(tǒng)頭文件庫(kù)尋找該文件

如果使用引號(hào),那么程序?qū)F(xiàn)在本地找一找,找不到才回去系統(tǒng)頭文件庫(kù)查找

從提升效率的角度講,系統(tǒng)頭文件調(diào)用時(shí)應(yīng)該使用<>

而個(gè)人創(chuàng)建的頭文件,應(yīng)該使用“”


?

總結(jié)

提示:這里對(duì)文章進(jìn)行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796987.html

到了這里,關(guān)于【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語(yǔ)言——程序環(huán)境和預(yù)處理(再也不用擔(dān)心會(huì)忘記預(yù)處理的知識(shí))

    C語(yǔ)言——程序環(huán)境和預(yù)處理(再也不用擔(dān)心會(huì)忘記預(yù)處理的知識(shí))

    先簡(jiǎn)單了解一下程序環(huán)境,然后詳細(xì)總結(jié)翻譯環(huán)境里的編譯和鏈接,然后在總結(jié)編譯預(yù)處理。 在 ANSI C 的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境 翻譯環(huán)境:這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 執(zhí)行環(huán)境:執(zhí)行二進(jìn)制代碼。 計(jì)算機(jī)如何執(zhí)行二進(jìn)制指令? 我們寫的C語(yǔ)

    2024年02月09日
    瀏覽(36)
  • C語(yǔ)言--程序環(huán)境和預(yù)處理(宏)

    C語(yǔ)言--程序環(huán)境和預(yù)處理(宏)

    目錄 前言 本章重點(diǎn): ?1. 程序的翻譯環(huán)境和執(zhí)行環(huán)境 2. 詳解編譯+鏈接 2.1 翻譯環(huán)境?編輯 2.2 編譯本身也分為幾個(gè)階段 2.3 運(yùn)行環(huán)境 3. 預(yù)處理詳解 3.1 預(yù)定義符號(hào) 3.2 #define 3.2.1 #define 定義標(biāo)識(shí)符 3.2.2 #define 定義宏 2.2.3 #define 替換規(guī)則 3.2.4 #和## ?3.2.5 帶副作用的宏參數(shù) 3.2.6 宏

    2024年02月07日
    瀏覽(17)
  • 【C語(yǔ)言進(jìn)階】程序環(huán)境和預(yù)處理

    【C語(yǔ)言進(jìn)階】程序環(huán)境和預(yù)處理

    ?? 博客主頁(yè): 小王又困了 ?? 系列專欄: C語(yǔ)言 ?? 人之為學(xué),不日近則日退? ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 目錄 一、程序的翻譯環(huán)境和執(zhí)行環(huán)境 二、詳解編譯和鏈接 2.1翻譯環(huán)境 2.2編譯的過(guò)程 ?2.3運(yùn)行環(huán)境 三、預(yù)處理詳解? 3.1預(yù)定義符號(hào) ?3.2#define 3.2.1 #define 定

    2024年02月15日
    瀏覽(19)
  • 程序環(huán)境和預(yù)處理(含C語(yǔ)言程序的編譯+鏈接)--2

    程序環(huán)境和預(yù)處理(含C語(yǔ)言程序的編譯+鏈接)--2

    文章前言: 上章我們把? ? ? 程序的翻譯環(huán)境? ? ?程序的執(zhí)行環(huán)境? ?C語(yǔ)言程序的編譯+鏈接? ? ?預(yù)定義符號(hào)介紹? ? 預(yù)處理指令? ?#define? ? 宏和函數(shù)的對(duì)比? ? ?預(yù)處理操作符? ? #和##的介紹 ? 的相關(guān)知識(shí)進(jìn)行了梳理講解,接下來(lái)被把剩余知識(shí)? ? 命令定義? ? ?預(yù)處

    2024年02月14日
    瀏覽(31)
  • 【C/C++】詳解程序環(huán)境和預(yù)處理(什么是程序環(huán)境?為什么要有程序環(huán)境?如何理解程序環(huán)境?)

    【C/C++】詳解程序環(huán)境和預(yù)處理(什么是程序環(huán)境?為什么要有程序環(huán)境?如何理解程序環(huán)境?)

    目錄 一、前言 二、 什么是程序環(huán)境? 三、 為什么要有程序環(huán)境? 四、如何理解程序環(huán)境? ???ANSI?C 標(biāo)準(zhǔn)? ???翻譯環(huán)境和執(zhí)行環(huán)境 ?五、詳解翻譯環(huán)境和執(zhí)行環(huán)境 ???翻譯環(huán)境(重點(diǎn)!?。????編譯環(huán)境(預(yù)處理---編譯---匯編) ???鏈接環(huán)境(鏈接) ???執(zhí)行環(huán)境

    2024年02月21日
    瀏覽(25)
  • C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

    C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

    今天我們來(lái)學(xué)習(xí)C語(yǔ)言中程序的編譯和鏈接是如何進(jìn)行的。 在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。 第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 第2種是執(zhí)行環(huán)境,它用于實(shí)際執(zhí)行代碼。 本文主要是介紹預(yù)編譯階段的相關(guān)知識(shí)。 1.組成一個(gè)程

    2023年04月09日
    瀏覽(33)
  • C語(yǔ)言-程序環(huán)境和預(yù)處理(2)--帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含

    C語(yǔ)言-程序環(huán)境和預(yù)處理(2)--帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含

    上一篇文章–《C語(yǔ)言-程序環(huán)境和預(yù)處理(1)》講述了程序的翻譯環(huán)境和執(zhí)行環(huán)境,編譯、連接,預(yù)定義符號(hào),#define,#符號(hào)和##符號(hào)的相關(guān)知識(shí)。 鏈接: 《C語(yǔ)言-程序環(huán)境和預(yù)處理(1)》 本篇文章,講述帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含的相

    2024年02月08日
    瀏覽(27)
  • 詳解C語(yǔ)言—預(yù)處理

    詳解C語(yǔ)言—預(yù)處理

    目錄 一、預(yù)處理 1、預(yù)定義符號(hào)介紹 2、預(yù)處理指令 #define #define 定義標(biāo)識(shí)符:? #define 定義宏: #define 替換規(guī)則 3、預(yù)處理操作符# 4、預(yù)處理操作符## 5、帶副作用的宏參數(shù) 6、宏和函數(shù)對(duì)比 二、命名約定 三、預(yù)處理指令 #undef 四、命令行定義 五、條件編譯? 1、單分支#if:

    2024年02月08日
    瀏覽(28)
  • C語(yǔ)言:預(yù)處理詳解

    C語(yǔ)言:預(yù)處理詳解

    創(chuàng)作不易,來(lái)個(gè)三連唄! C語(yǔ)?設(shè)置了?些預(yù)定義符號(hào), 可以直接使? ,預(yù)定義符號(hào)也是在預(yù)處理期間處理的。 __FILE__ //進(jìn)?編譯的源?件 __LINE__ //?件當(dāng)前的?號(hào) __DATE__ //?件被編譯的?期 __TIME__ //?件被編譯的時(shí)間 __STDC__ //如果編譯器遵循ANSI C,其值為1,否則未定義

    2024年01月19日
    瀏覽(37)
  • C語(yǔ)言預(yù)處理詳解

    C語(yǔ)言預(yù)處理詳解

    上一篇博客中我們講了C語(yǔ)言的編譯與鏈接,在編譯過(guò)程中有三個(gè)小階段:預(yù)處理、編譯、匯編。 本篇博客將詳細(xì)講述預(yù)處理部分的有關(guān)知識(shí)點(diǎn) 。 在C語(yǔ)言中,C語(yǔ)言本身設(shè)置了?些預(yù)定義符號(hào),可以直接使? ,預(yù)定義符號(hào)的處理也是在預(yù)處理期間進(jìn)行的。 在這里介紹幾個(gè)常

    2024年04月15日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包