最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂C語(yǔ)言預(yù)處理宏定義

 更新時(shí)間:2022年10月12日 14:46:14   作者:期邈云漢  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言預(yù)處理宏定義#define,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

預(yù)定義符號(hào)

這些預(yù)定義符號(hào)都是語(yǔ)言內(nèi)置的

__FILE__      //進(jìn)行編譯的源文件
__LINE__     //文件當(dāng)前的行號(hào)
__DATE__    //文件被編譯的日期
__TIME__    //文件被編譯的時(shí)間
__STDC__    //如果編譯器遵循ANSI C,其值為1,否則未定義

VS環(huán)境下未定義__STDC__ ,說(shuō)明Visual Studio并未完全遵循ANSI C。

#define

#define 定義標(biāo)識(shí)符

#define name stuff  //名稱;內(nèi)容
#define MAX 1000
#define reg register          //為 register這個(gè)關(guān)鍵字,創(chuàng)建一個(gè)簡(jiǎn)短的名字
#define do_forever for(;;)     //用更形象的符號(hào)來(lái)替換一種實(shí)現(xiàn)
#define CASE break;case        //在寫(xiě)case語(yǔ)句的時(shí)候自動(dòng)把 break寫(xiě)上。
// 如果定義的 stuff過(guò)長(zhǎng),可以分成幾行寫(xiě),除了最后一行外,每行的后面都加一個(gè)反斜杠(續(xù)行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ ,       \
__DATE__,__TIME__ )


int main() {
	printf("%d\n", MAX);
	printf("%s\n", STR);
	do_forever;  //執(zhí)行到這里會(huì)死循環(huán)
	return 0;
}

在define進(jìn)行定義時(shí),最好不要在后面加上分號(hào) ;,替換時(shí)也會(huì)將分號(hào)替換,容易導(dǎo)致問(wèn)題。

#define 1000;
int max = 0;
	if (3 > 1)
		max = MAX;
	else
		max = 0;
//報(bào)錯(cuò)

#define 定義宏

#define 機(jī)制包括了一個(gè)規(guī)定,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常稱為宏(macro)或定義宏(define macro)

#define name( parament-list ) stuff

其中的 parament-list 是一個(gè)由逗號(hào)隔開(kāi)的符號(hào)表,它們可能出現(xiàn)在stuff中。

//int Max(int x, int y) {
//	return (x > y ? x : y);
//}
//若采用宏定義
#define Max(x,y) (x>y?x:y)
int main() {
	int a = 10;
	int b = 5;
	int max = Max(a, b);
	printf("%d\n", max);
	return 0;
}

最終得到較大值10。找到了宏的標(biāo)識(shí),直接進(jìn)行符號(hào)替換。

  • 參數(shù)列表的左括號(hào)必須與name緊鄰。
  • 如果兩者之間有任何空白存在,參數(shù)列表就會(huì)被解釋為stuff的一部分

例如:

#define SQUARE(x) x*x

int main() {
	printf("%d\n", SQUARE(5));
	printf("%d\n", SQUARE(5 + 1));  //宏的參數(shù)是完全替換的,相當(dāng)于 5 + 1 * 5 + 1  結(jié)果為11 
	return 0;
}

做改進(jìn):

#define SQUARE(x) (x)*(x)  //這樣就不容易出錯(cuò)
//最好最外層也加上括號(hào)

考慮如下計(jì)算:

#define Double(x) (x)+(x)
int main() {
	int a = 5;
	printf("%d\n", (10 * Double(a)));  //這里相當(dāng)于 10 * (5) + (5)  結(jié)果為55
	return 0;
}

在宏替換內(nèi)容上加上括號(hào)以保證得到預(yù)期的結(jié)果。

#define Double(x) ((x)+(x))

所以用于對(duì)數(shù)值表達(dá)式進(jìn)行求值的宏定義都應(yīng)該用這種方式加上括號(hào),避免在使用宏時(shí)由于參數(shù)中的操作符或鄰近操作符之間不可預(yù)料的相互作用。

替換規(guī)則

在程序中擴(kuò)展#define定義符號(hào)和宏時(shí),需要涉及幾個(gè)步驟。

  • 在調(diào)用宏時(shí),首先對(duì)參數(shù)進(jìn)行檢查,看看是否包含任何由#define定義的符號(hào)。如果是,它們首先被替換。
  • 替換文本隨后插入到程序中原來(lái)文本的位置。對(duì)于宏,參數(shù)名被他們的值所替換。
  • 最后,再次對(duì)結(jié)果文件進(jìn)行掃描,看看它是否包含任何由#define定義的符號(hào)。如果是,就重復(fù)上述處理過(guò)程。

注意:

宏參數(shù)和#define 定義中可以出現(xiàn)其他#define定義的符號(hào)。但是對(duì)于宏,不能出現(xiàn)遞歸。

當(dāng)預(yù)處理器搜索#define定義的符號(hào)的時(shí)候,字符串常量的內(nèi)容并不被搜索。

# 和##

如何把參數(shù)插入到字符串中?

#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT "\n", VALUE)
 
//這里#可以把其后面的參數(shù)替換為字符串嵌入

int main() {
	printf("hello world\n");
	printf("hello ""world\n");  //天然合為一個(gè)字符串(發(fā)現(xiàn)字符串是有自動(dòng)連接的特點(diǎn)的)
	int a = 100;
	printf("The value a is %d\n", a);
	int b = 20;
	printf("The value b is %d\n", b);

	//那么考慮能否將同一個(gè)功能的打印操作合并
	PRINT("%d", a);  //這里只有當(dāng)字符串作為宏參數(shù)的時(shí)候才可以把字符串放在字符串中
	/*代碼中的 #VALUE 會(huì)預(yù)處理器處理為:
		"VALUE" .*/
		
	return 0;
}

把宏對(duì)應(yīng)的參數(shù)替換為字符串

##的作用

將分離的片段合成為一個(gè)符號(hào)

#define CAT(A,B) A##B
//把A和B組合成一個(gè)符號(hào)
int main() {
	int Windows11 = 2022;

	printf("%d\n", CAT(Windows, 11));

}

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

當(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++;//帶有副作用

考慮宏:

//考慮宏的副作用
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main() {
	int x = 5;
	int y = 8;
	int z = MAX(x++, y++);
	printf("x=%d y=%d z=%d\n", x, y, z);
	//z = ((x++) > (y++) ? (x++) : (y++));  x = 6  y = 10  z = 9  
}

到此這篇關(guān)于一文帶你搞懂C語(yǔ)言預(yù)處理宏定義的文章就介紹到這了,更多相關(guān)C語(yǔ)言預(yù)處理宏定義內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法匯總

    VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法匯總

    這篇文章主要介紹了VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法,對(duì)于更好的了解OpenGL很有幫助,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例

    C語(yǔ)言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的<ctype.h>和<string.h>頭文件分別提供了豐富的字符處理和字符串處理函數(shù),本文就來(lái)介紹一下C語(yǔ)言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-11-11
  • C++?如何使用棧求解中綴、后綴表達(dá)式的值

    C++?如何使用棧求解中綴、后綴表達(dá)式的值

    這篇文章主要介紹了C++?使用棧求解中綴、后綴表達(dá)式的值,本文講解了中綴、后綴表達(dá)式的求值過(guò)程以及如何將一個(gè)中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,需要的朋友可以參考下
    2022-10-10
  • 深入解析C++程序中激發(fā)事件和COM中的事件處理

    深入解析C++程序中激發(fā)事件和COM中的事件處理

    這篇文章主要介紹了深入解析C++程序中激發(fā)事件和COM中的事件處理,是C++事件操作的基礎(chǔ),需要的朋友可以參考下
    2016-01-01
  • C++11 學(xué)習(xí)筆記之std::function和bind綁定器

    C++11 學(xué)習(xí)筆記之std::function和bind綁定器

    這篇文章主要介紹了C++11 學(xué)習(xí)筆記之std::function和bind綁定器,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 通過(guò)示例詳解C++智能指針

    通過(guò)示例詳解C++智能指針

    這篇文章主要為大家通過(guò)示例介紹了C++智能指針的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • C++中的vector使用詳解及重要部分底層實(shí)現(xiàn)

    C++中的vector使用詳解及重要部分底層實(shí)現(xiàn)

    本篇文章會(huì)對(duì)vector的語(yǔ)法使用進(jìn)行詳解,同時(shí),還會(huì)對(duì)重要難點(diǎn)部分的底層實(shí)現(xiàn)進(jìn)行講解,其中有vector的迭代器失效和深拷貝問(wèn)題,希望本篇文章的內(nèi)容會(huì)對(duì)你有所幫助
    2023-07-07
  • C++關(guān)于引用(reference)的代碼案例

    C++關(guān)于引用(reference)的代碼案例

    引用是C++中的一種重要特性,它可以讓代碼更加高效、簡(jiǎn)潔和易讀,本文將深入探討引用的相關(guān)知識(shí),包括引用的概念、使用方法、優(yōu)點(diǎn)和注意事項(xiàng)等。建議根據(jù)給出的代碼案例練一下,熟悉即可
    2023-05-05
  • 使用VScode搭建ROS開(kāi)發(fā)環(huán)境的教程詳解

    使用VScode搭建ROS開(kāi)發(fā)環(huán)境的教程詳解

    這篇文章主要介紹了使用VScode搭建ROS開(kāi)發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 深入解析C++中的auto自動(dòng)類型推導(dǎo)

    深入解析C++中的auto自動(dòng)類型推導(dǎo)

    C++標(biāo)準(zhǔn)委員會(huì)在C++11標(biāo)準(zhǔn)中改變了auto關(guān)鍵字的語(yǔ)義,使它變成一個(gè)類型占位符,允許在定義變量時(shí)不必明確寫(xiě)出確切的類型,讓編譯器在編譯期間根據(jù)初始值自動(dòng)推導(dǎo)出它的類型,下面我們就來(lái)看看auto自動(dòng)類型推導(dǎo)的推導(dǎo)規(guī)則吧
    2024-04-04

最新評(píng)論

凉山| 宜阳县| 大石桥市| 新沂市| 钟山县| 阿坝| 新巴尔虎右旗| 岐山县| 金华市| 乐亭县| 蒙城县| 南丰县| 武鸣县| 喀喇| 永仁县| 栖霞市| 茶陵县| 新郑市| 衡东县| 方山县| 无锡市| 仁布县| 湘乡市| 曲阳县| 红河县| 兴城市| 象州县| 长子县| 安顺市| 察雅县| 鸡西市| 道真| 山东省| 汉源县| 博客| 鹤峰县| 娄烦县| 顺昌县| 松潘县| 甘谷县| 松桃|