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

C語(yǔ)言超全面define預(yù)處理指令的使用說(shuō)明

 更新時(shí)間:2022年04月22日 10:35:55   作者:耀 星  
C語(yǔ)言里可以用#define定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量。特點(diǎn)是:定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了,也不做類型定義。預(yù)編譯又叫預(yù)處理

前言

C語(yǔ)言中源代碼到可執(zhí)行文件的第一階段,也就是預(yù)處理階段,會(huì)檢查源文件中的預(yù)處理指令語(yǔ)句和宏定義,并對(duì)源代碼進(jìn)行相應(yīng)的替換,預(yù)處理過(guò)程還會(huì)刪除程序中的注釋和多余的空白符號(hào)。

預(yù)處理指令是以#開(kāi)頭的代碼行,#必須是該行除了空白符外的第一個(gè)字符,#后是指令關(guān)鍵字,在#和指令關(guān)鍵字之間允許存在若干個(gè)空白字符,define是宏定義命令。在C語(yǔ)言程序中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為“宏”,“宏”又分為有參和無(wú)參,有參又稱為“宏函數(shù)”,被定義為“宏”的標(biāo)識(shí)符稱為“宏名”。

#define 定義宏(無(wú)參)

語(yǔ)法規(guī)定:

#define name stuff
name:標(biāo)識(shí)符名\宏名
stuff:可以是關(guān)鍵字、常量、關(guān)鍵字、標(biāo)識(shí)符、標(biāo)點(diǎn)符號(hào)、運(yùn)算符,表達(dá)式

在預(yù)處理階段,編譯器會(huì)在程序中使用#define定義的標(biāo)識(shí)符替換成stuff,可以通過(guò)預(yù)處理生成的.i文件查看效果。

//stuff是數(shù)值常量
#define NUM 10

//stuff是關(guān)鍵字
#define reg register

//stuff是標(biāo)點(diǎn)符號(hào)
#define GREATER_THAN >

//stuff的更多表達(dá)方式
#define do_forever for(;;)
//若定義的stuff過(guò)長(zhǎng),可以分成幾行寫,除了最后一行外,每行的后面都加一個(gè)\(續(xù)行符)
#define DBBUG_PRINT printf("file:%s\tline:%d\t \
                    date:%s\ttime:%s\n",\
                    __FILE__,__LINE__,\
                    __DATE__,__TIME__)

總結(jié):#define定義的name(宏名),在預(yù)編譯階段會(huì)將所有的宏名替換成stuff,stuff內(nèi)容被替換到源代碼中。稱為“宏代換”或“宏展開(kāi)”。

注意:define定義的標(biāo)識(shí)符的時(shí)候,后面加上“;”會(huì)將“;”認(rèn)為是stuff中的內(nèi)容。

#define 定義宏函數(shù)

宏函數(shù)的申明方式:#define name(parament-list) stuff
parament-list:參數(shù)列表

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

宏函數(shù)存在的問(wèn)題1

#include <stdio.h>
#define SQUARE(x) x*x//定義一個(gè)宏函數(shù)求平方
int main()
{
    int x = SQUARE(3+1);//替換后x的計(jì)算結(jié)果是多少?答案是:7
 
}

 為什么呢?

在給宏函數(shù)傳參時(shí),如果傳遞的是一個(gè)表達(dá)式,不會(huì)先計(jì)算表達(dá)式的結(jié)果再進(jìn)行傳參,而是直接將表達(dá)式整體作為參數(shù)傳遞。

那么如何防止發(fā)生這樣的情況呢?+()

 宏函數(shù)存在的問(wèn)題2

#include <stdio.h>
#define SUM(x,y) (x)+(y)
int main()
{
    int a = 10;
    int b = 5;
    int c = SUM(a,b)*2;//替換后c的結(jié)果為20,why
    return 0;
}

我們看看替換后的結(jié)果

 這又該如何解決呢?

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

 #define替換規(guī)則:

1.在使用宏函數(shù)時(shí),首先對(duì)參數(shù)進(jìn)行檢查,看看參數(shù)中是否包含任何#define定義的標(biāo)識(shí)符,如果有,他們首先被替換。

2.替換的內(nèi)容被插入到源文件原來(lái)的位置。對(duì)于宏函數(shù),參數(shù)名被他們的值替換

宏的更多規(guī)則特性

1.宏名一般用大寫

2.使用宏可提高程序的通用性和易讀性,便于修改。

3.宏定義末尾不加分號(hào)

4.宏定義寫在函數(shù)的大括號(hào)外面,作用域?yàn)槠浜蟮某绦?,通常放在開(kāi)頭

5.宏函數(shù)不可遞歸

6.宏定義不分配內(nèi)存,變量定義分配內(nèi)存

7.字符串" "中永遠(yuǎn)不包含宏

8.宏定義不存在類型問(wèn)題,他的參數(shù)也沒(méi)有類型

宏的缺點(diǎn)

1.宏不能調(diào)試

2.宏由于與類型無(wú)關(guān),不夠嚴(yán)謹(jǐn)

3.宏可能帶來(lái)運(yùn)算符優(yōu)先級(jí)的問(wèn)題,導(dǎo)致容易出錯(cuò)

常見(jiàn)預(yù)處理指令

#define:宏定義

#undef:撤銷已經(jīng)定義過(guò)的宏名

#include:將另一個(gè)源文件嵌入到#include源文件中

#if~#endif:如果#if后面的常量表達(dá)式為真,則編譯#if~#endif之間的代碼,如果為假,跳過(guò)這些代碼不編譯。

#if~#elif~#else~#endif:和if~else if~else類似,可以建立更分支。

#ifdef symbol~endif:判斷是否被定義,定義了編譯他們之間內(nèi)容

#ifndef symbol~endif:判斷是否被定義,沒(méi)定義編譯他們之間的內(nèi)容

#line:改變當(dāng)前行數(shù)和文件名稱,是在編譯程序中預(yù)先定義的標(biāo)識(shí)符命令的基本形式:#line number["filename"]

#error:編譯程序時(shí),只要遇到#error就會(huì)生成一個(gè)編譯錯(cuò)誤的提示信息,并停止編譯。

#pragma: 可以設(shè)定編譯程序完成一些特點(diǎn)的動(dòng)作(可以通過(guò)編譯程序的菜單中設(shè)置),可以向編譯程序傳送各種指令。

到此這篇關(guān)于C語(yǔ)言超全面define預(yù)處理指令的使用說(shuō)明的文章就介紹到這了,更多相關(guān)C語(yǔ)言define內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

禹城市| 榆社县| 历史| 荆州市| 土默特右旗| 阜阳市| 鞍山市| 固镇县| 宁陵县| 绵阳市| 建水县| 临湘市| 浙江省| 临海市| 达拉特旗| 龙山县| 大港区| 麻栗坡县| 石泉县| 湖北省| 苏尼特左旗| 印江| 阿拉善右旗| 河北省| 濮阳市| 迁安市| 蒙山县| 桑植县| 策勒县| 广汉市| 卓资县| 浠水县| 汪清县| 犍为县| 汉沽区| 隆昌县| 太谷县| 鹤壁市| 崇礼县| 馆陶县| 遂昌县|