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

C語言進(jìn)階教程之預(yù)處理

 更新時(shí)間:2023年02月10日 10:09:14   作者:sukuni  
C語言提供了多種預(yù)處理功能,如宏定義、文件包含、條件編譯等,下面這篇文章主要給大家介紹了關(guān)于C語言進(jìn)階教程之預(yù)處理的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一.代碼運(yùn)行是的兩種環(huán)境

1.翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。
2.執(zhí)行環(huán)境,它用于實(shí)際執(zhí)行代碼

下面主要講解翻譯環(huán)境。

二.翻譯環(huán)境

從.c 文件到 .exe 文件需要經(jīng)過編譯器的翻譯,而翻譯又分為 編譯和鏈接兩個(gè)部分

編譯又分為三個(gè)部分:

1.預(yù)編譯:又叫預(yù)處理,在這個(gè)部分主要完成頭文件的包含,#define的替換,注釋的刪除;

2.編譯:主要完成語法分析,詞法分析,詞義分析,符號(hào)匯總(符號(hào)包括全局性的變量和函數(shù)),生成匯編代碼;

3.匯編:生成二進(jìn)制指令,形成符號(hào)表(符號(hào)表是由符號(hào)和其地址組成的);

鏈接:合并段表,合并符號(hào)表(在這個(gè)階段會(huì)發(fā)現(xiàn)未定義的函數(shù))。

見下圖:

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

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

四.#define

1.define  定義宏

宏的申明方式:

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

注意 name 需與后面的括號(hào)緊密相連,不可以有空格,如果有任何空白存在,參數(shù)列表就會(huì)被解釋為stuff的一部分。

注意當(dāng)我們定義宏的時(shí)候,不要吝嗇括號(hào)!

來看下面一個(gè)例子:

#define MOD(x,y) x*y
 
int main()
{
	int m = MOD(2+3,2);
	printf("%d\n", m);
	return 0;
}

對(duì)初學(xué)者來說,這段代碼的答案很容易被認(rèn)為式10,但事實(shí)并非如此,因?yàn)楹晔窃陬A(yù)處理階段先替換掉,然后在進(jìn)行計(jì)算,所以在沒有括號(hào)的情況下,替換后是這樣的:2+3*2=8;所以若是想要得到10這個(gè)結(jié)果,就要加上括號(hào),即:

#define MOD(x,y) ((x)*(y))

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

我們知像是前置++ ,后置++這種的運(yùn)算符是會(huì)改變操作數(shù)的值屬性的,那它如果應(yīng)用到#define 定義的宏中會(huì)是怎么樣呢?

我們來看下面這個(gè)例子:

#define MAX(x,y) ((x)>(y)?(x):(y))
 
int main()
{
	int a = 4;
	int b = 6;
	int m = MAX(a++, b++);
	printf("m=%d\n", m);
	printf("a=%d b=%d\n", a, b);
	return 0;
}

最后的答案會(huì)是多少呢?

首先完成宏參數(shù)的替換:((a++)>(b++)?(a++):(b++))

后置++是先使用后++,因?yàn)?<6,所以執(zhí)行后面的 b++,經(jīng)過前面的++,此時(shí)a=5,b=7,所以先把7賦給m,然后b++,得到b=8;

即m=7  a=5  b=8

總結(jié): 

1.#define 定義的符號(hào)需要先原封不動(dòng)的替換掉,所以建議在#define 后面不加 ' ; ' ;

2.#define 定義的宏不要吝嗇括號(hào),以免出現(xiàn)出乎意料的結(jié)果;

3.避免使用帶有副作用的運(yùn)算符。

五.#define定義宏 與函數(shù)對(duì)比

六.預(yù)處理指令

所有的預(yù)處理指令都是以井號(hào)(#)開頭。它必須是第一個(gè)非空字符,為了增強(qiáng)可讀性,預(yù)處理指令應(yīng)從第一列開始。下面列出了所有重要的預(yù)處理指令:

七.條件編譯

可以實(shí)現(xiàn)將一條語句(一組語句)編譯或者放棄。

常見的條件編譯指令:

1.
#if 常量表達(dá)式
//...
#endif
//常量表達(dá)式由預(yù)處理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__
//..
#endif

 例:

int main()
{
#if 1    //如果這個(gè)常量表達(dá)式為真,則執(zhí)行后面的語句,反之則不執(zhí)行
	printf("haha\n");
#endif
	return 0;
}

運(yùn)行結(jié)果:

2.多個(gè)分支的條件編譯
#if 常量表達(dá)式
//...
#elif 常量表達(dá)式 (注意這里是 elif ,而不是else if )
//...
#else
//...
#endif 

例:

#define M 10
 
int main()
{
#if M==5
	printf("mafumafu\n");
#elif M==10
	printf("Eve\n");
#elif M==7
	printf("Sou\n");
#elif M==2
	printf("amatsuki\n");
#else 
	printf("soraru");
#endif
	return 0;
}

運(yùn)行結(jié)果:

3.嵌套指令 

        #if defined(OS_UNIX)    //如果定義了,則往下執(zhí)行
                #ifdef OPTION1
                        unix_version_option1();
                #endif
                #ifdef OPTION2
                        unix_version_option2();
                #endif
                #elif defined(OS_MSDOS)
                #ifdef OPTION2
                        msdos_version_option2();
                #endif
        #endif

八.頭文件包含的方式

1.  雙引號(hào)式 #include "test.h"  :先在源文件所在目錄下查找,如果該頭文件未找到,編譯器                                                     就像查找?guī)旌瘮?shù)頭文件一樣在標(biāo)準(zhǔn)位置查找頭文件。
                                                 如果找不到就提示編譯錯(cuò)誤。

2.尖括號(hào)式 #include <stdio.h>: 查找頭文件直接去標(biāo)準(zhǔn)路徑下去查找,如果找不到就提示編                                                     譯錯(cuò)誤。

所以說庫里的頭文件也可以用 雙引號(hào) 包含 ,但并不建議這樣做,因?yàn)殡p引號(hào)包含沒有尖括號(hào)包含的查找的快。

嵌套文件包含

 comm.h和comm.c是公共模塊。
test1.h和test1.c使用了公共模塊。
test2.h和test2.c使用了公共模塊。
test.h和test.c使用了test1模塊和test2模塊。
這樣最終程序中就會(huì)出現(xiàn)兩份comm.h的內(nèi)容。這樣就造成了文件內(nèi)容的重復(fù)。

如何防止這種問題出現(xiàn)?

有兩種解決方式:

1.利用條件編譯指令

#ifndef __TEST_H__   //如果沒有定義  TEST_H__  則執(zhí)行下一句代碼  定義 __TEST_H__
#define __TEST_H__
#endif

2.利用預(yù)處理指令  #pragma   once

《高質(zhì)量C/C++編程指南》中的兩個(gè)問題

1. 頭文件中的 ifndef/define/endif是干什么用的?

   防止頭文件的重復(fù)引用。
2. #include <filename.h> 和 #include "filename.h"有什么區(qū)別?

   文件的查找策略不同。

總結(jié)

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

相關(guān)文章

  • C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    在C/C++程序中,會(huì)需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實(shí)現(xiàn)程序想要的效果,下面將介紹多種方法實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C語言中有哪些字符處理函數(shù)你知道嗎

    C語言中有哪些字符處理函數(shù)你知道嗎

    這篇文章主要為大家詳細(xì)介紹了C語言字符處理函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++11如何引入的尾置返回類型

    C++11如何引入的尾置返回類型

    C++11 標(biāo)準(zhǔn)引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標(biāo)準(zhǔn)的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下
    2023-01-01
  • C語言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法

    C語言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C語言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解C語言的exp()函數(shù)和ldexp()函數(shù)以及frexp()函數(shù)

    詳解C語言的exp()函數(shù)和ldexp()函數(shù)以及frexp()函數(shù)

    這篇文章主要介紹了詳解C語言的exp()函數(shù)和ldexp()函數(shù)以及frexp()函數(shù),注意這三個(gè)函數(shù)雖然看起來相似但實(shí)際功能卻大相徑庭!需要的朋友可以參考下
    2015-08-08
  • 淺談C++中各種不同意義的new和delete的使用

    淺談C++中各種不同意義的new和delete的使用

    本文主要介紹了淺談C++中各種不同意義的new和delete的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 在C語言里單引號(hào)和雙引號(hào)的區(qū)別

    在C語言里單引號(hào)和雙引號(hào)的區(qū)別

    這篇文章主要介紹了在C語言里單引號(hào)和雙引號(hào)的區(qū)別,本文通過代碼的實(shí)例和注釋的詳細(xì)的說明了單引號(hào)和雙引號(hào)的概念與區(qū)別,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ pair的用法實(shí)例詳解

    C++ pair的用法實(shí)例詳解

    這篇文章主要介紹了C++ pair的用法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++ Template應(yīng)用詳解

    C++ Template應(yīng)用詳解

    本篇文章主要介紹了C++ Template應(yīng)用詳解,模板(Template)指C++程序設(shè)計(jì)設(shè)計(jì)語言中采用類型作為參數(shù)的程序設(shè)計(jì),支持通用程序設(shè)計(jì)。
    2016-12-12
  • C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

房产| 溆浦县| 蓝山县| 东光县| 淮安市| 武鸣县| 马山县| 宣城市| 舟曲县| 白水县| 彭山县| 洪江市| 石楼县| 营山县| 栖霞市| 房山区| 开阳县| 博乐市| 太湖县| 乐至县| 玛多县| 界首市| 偃师市| 绥江县| 广宁县| 盱眙县| 兴海县| 蒙自县| 安达市| 徐闻县| 含山县| 西乡县| 平遥县| 祥云县| 屏边| 安徽省| 忻州市| 祁阳县| 金乡县| 荔浦县| 随州市|