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

【C語(yǔ)言】預(yù)處理

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

一、程序環(huán)境

1、程序的翻譯環(huán)境和執(zhí)行環(huá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í)行代碼。

2、編譯+鏈接

1.翻譯環(huán)境

  • 組成一個(gè)程序的每個(gè)源文件通過(guò)編譯過(guò)程分別轉(zhuǎn)換成目標(biāo)代碼
  • 每個(gè)目標(biāo)文件由鏈接器(linker)捆綁在一起,形成一個(gè)單一而完整的可執(zhí)行程序。
  • 鏈接器同時(shí)也會(huì)引入標(biāo)準(zhǔn)C函數(shù)庫(kù)中任何被該程序所用到的函數(shù),而且它可以搜索程序員個(gè)人
    的程序庫(kù),將其需要的函數(shù)也鏈接到程序中。

2.翻譯階段

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

3.運(yùn)行環(huán)境

程序執(zhí)行的過(guò)程:

  1. 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:一般這個(gè)由操作系統(tǒng)完成。在獨(dú)立的環(huán)境中,程序的載入必須由手工安排,也可能是通過(guò)可執(zhí)行代碼置入只讀內(nèi)存來(lái)完成。
  2. 程序的執(zhí)行便開(kāi)始。接著便調(diào)用main函數(shù)。
  3. 開(kāi)始執(zhí)行程序代碼。這個(gè)時(shí)候程序?qū)⑹褂靡粋€(gè)運(yùn)行時(shí)堆棧(stack),存儲(chǔ)函數(shù)的局部變量和返回
    地址。程序同時(shí)也可以使用靜態(tài)(static)內(nèi)存,存儲(chǔ)于靜態(tài)內(nèi)存中的變量在程序的整個(gè)執(zhí)行過(guò)程
    一直保留他們的值。
  4. 終止程序。正常終止main函數(shù);也有可能是意外終止。

二、預(yù)處理

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

符號(hào) 含義
FILE 進(jìn)行編譯的源文件
LINE 文件當(dāng)前的行號(hào)
DATE 文件被編譯的日期
TIME 文件被編譯的時(shí)間
STDC 如果編譯器遵循ANSI C,其值為1,否則未定義
#include <stdio.h>
int main()
{
	printf("line:%d\n", __LINE__);
	printf("date:%s\n", __DATE__);
	printf("time:%s\n", __TIME__);
	return 0;
}

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

2、#define

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

語(yǔ)法:

#define name stuff

栗子:

#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        //在寫case語(yǔ)句的時(shí)候自動(dòng)把 break寫上。
// 如果定義的 stuff過(guò)長(zhǎng),可以分成幾行寫,除了最后一行外,每行的后面都加一個(gè)反斜杠(續(xù)行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
                          __FILE__,__LINE__ ,  \
                          __DATE__,__TIME__ )   

define定義標(biāo)識(shí)符的時(shí)候,最好不要在最后加上 ’;‘,容易發(fā)生錯(cuò)誤

2.#define定義宏

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

申明方式:

//其中的 parament-list 是一個(gè)由逗號(hào)隔開(kāi)的符號(hào)表,它們可能出現(xiàn)在stuff中。
#define name( parament-list ) stuff
//參數(shù)列表的左括號(hào)必須與name緊鄰。
//如果兩者之間有任何空白存在,參數(shù)列表就會(huì)被解釋為stuff的一部分。

栗子:

#define A 2+2
#define B 3+3
#define C A*B
int main()
{
//這里的宏C看起來(lái)是求A*B   結(jié)果為(2+2)*(3+3)=24
//由于沒(méi)有括號(hào)C算的其實(shí)是  2+2*3+3=11
	printf("%d\n", C);
  return 0;
}

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

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

3.#define替換規(guī)則

  1. 在調(diào)用宏時(shí),首先對(duì)參數(shù)進(jìn)行檢查,看看是否包含任何由#define定義的符號(hào)。如果是,它們首先
    被替換。
  2. 替換文本隨后被插入到程序中原來(lái)文本的位置。對(duì)于宏,參數(shù)名被他們的值所替換。
  3. 最后,再次對(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)容并不被搜索。

4.#和##

使用 # ,把一個(gè)宏參數(shù)變成對(duì)應(yīng)的字符串。

#define PRINT(n, format) printf("the value of "#n" is " format "\n", n)
int main()
{
	int a = 20;
	//printf("the value of a is %d\n", a);
	PRINT(a, "%d");

	int b = 15;
	//printf("the value of b is %d\n", b);
	PRINT(b, "%d");

	float f = 4.5f;
	//printf("the value of f is %f\n", f);
	PRINT(f, "%f");
	return 0;
}

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

##可以把位于它兩邊的符號(hào)合成一個(gè)符號(hào)。
它允許宏定義從分離的文本片段創(chuàng)建標(biāo)識(shí)符。

#define CAT(x,y) x##y
//這樣的連接必須產(chǎn)生一個(gè)合法的標(biāo)識(shí)符,否則其結(jié)果就是未定義的
int main()
{
	int peoplesum = 1000;
	printf("%d\n", CAT(people, sum));
	printf("%d\n", peoplesum);
	return 0;
}

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

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

宏參數(shù)的副作用

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

#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main()
{
	int x = 5;
	int y = 8;
	int z = MAX(x++, y++);
	//z = ( (x++) > (y++) ? (x++) : (y++));
	//       5    >   8   ?         √
	//     x=6      y=9            z=9,y=10
	printf("x=%d y=%d z=%d\n", x, y, z);//輸出的結(jié)果是什么?
	return 0;
}

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

6.宏和函數(shù)

屬性 函數(shù)
代碼長(zhǎng)度 每次使用時(shí),宏代碼都會(huì)被插入到程序中。除了非常小的宏之外,程序的長(zhǎng)度會(huì)大幅度增長(zhǎng) 函數(shù)代碼只出現(xiàn)于一個(gè)地方;每次使用這個(gè)函數(shù)時(shí),都調(diào)用那個(gè)地方的同一份代碼
執(zhí)行速度 更快 存在函數(shù)的調(diào)用和返回的額外開(kāi)銷,所以相對(duì)慢一些
操作符優(yōu)先級(jí) 宏參數(shù)的求值是在所有周圍表達(dá)式的上下文環(huán)境里,除非加上括號(hào),否則鄰近操作符的優(yōu)先級(jí)可能會(huì)產(chǎn)生不可預(yù)料的后果,所以建議宏在書(shū)寫的時(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ù)是可以遞歸的

7.命名約定

把宏名全部大寫 MAX
函數(shù)名不要全部大寫 Max

3、#undef

用于移除一個(gè)宏定義

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

4、條件編譯

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

常見(jiàn)的條件編譯指令:

  1. 單個(gè)分支的條件編譯
#if 常量表達(dá)式
 //...
#endif
  1. 多個(gè)分支的條件編譯
#if 常量表達(dá)式
 //...
#elif 常量表達(dá)式
 //...
#else
 //...
#endif
  1. 判斷是否被定義
#if defined(symbol)
#ifdef symbol

#if !defined(symbol)
#ifndef symbol
  1. 嵌套指令
#if defined(OS_UNIX)
   #ifdef OPTION1
      unix_version_option1();
   #endif
   #ifdef OPTION2
      unix_version_option2();
   #endif
#elif defined(OS_MSDOS)
   #ifdef OPTION2
      msdos_version_option2();
   #endif
#endif

5、文件包含

#include 指令可以使另外一個(gè)文件被編譯。就像它實(shí)際出現(xiàn)于 #include 指令的地方一樣。
預(yù)處理器先刪除這條指令,并用包含文件的內(nèi)容替換。
這樣一個(gè)源文件被包含10次,那就實(shí)際被編譯10次。

可以利用條件編譯避免頭文件的重復(fù)引用

  1. 每個(gè)文件開(kāi)頭寫
#ifndef __TEST_H__
#define __TEST_H__
//頭文件的內(nèi)容
#endif   //__TEST_H__
  1. #pragma once

頭文件被包含的方式

  • 本地文件包含
    #include "filename"

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

  • 庫(kù)文件包含
    #include <filename.h>

直接去標(biāo)準(zhǔn)路徑下去查找,如果找不到就提示編譯錯(cuò)誤。

【C語(yǔ)言】預(yù)處理,C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-583032.html

到了這里,關(guān)于【C語(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ǔ)言·預(yù)處理詳解

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

    ????????C語(yǔ)言設(shè)置了一些預(yù)定義符號(hào),可以直接使用,預(yù)定義符號(hào)也是在預(yù)處理期間處理的 ????????????????__FILE__ ?進(jìn)行編譯的源文件 ????????????????__LINE__ ?文件當(dāng)前的行號(hào) ????????????????__DATE__ ?文件被編譯的日期 ????????????????_

    2024年01月21日
    瀏覽(33)
  • C語(yǔ)言【預(yù)處理器】

    1、一些關(guān)于預(yù)處理的知識(shí) ?C代碼中,一般帶 # 的都是預(yù)處理指令,包括 宏替換、文件包含、條件編譯 等。 ?為兼容一些老編譯器, # 前后一般不寫空格 ?預(yù)處理指令后面不加分號(hào)。 2、宏定義 3、文件包含 ?自定義頭文件,用\\\" \\\" 。 引號(hào)里填相對(duì)路徑或絕對(duì)路徑?;诋?dāng)

    2024年02月05日
    瀏覽(21)
  • 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日
    瀏覽(38)
  • 【C語(yǔ)言】預(yù)處理詳解

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

    ???????? 本文目錄 1 預(yù)定義符號(hào) 2 #define 2.1 #define 定義標(biāo)識(shí)符 2.2 #define 定義宏 2.3 #define 替換規(guī)則 2.4 #和## 2.5 帶副作用的宏參數(shù) 2.6 宏和函數(shù)對(duì)比 2.7 命名約定 3 #undef 4 命令行定義 5 條件編譯 6 文件包含 6.1 頭文件被包含的方式 6.2 嵌套文件包含 這些預(yù)定義符號(hào)都是語(yǔ)言內(nèi)置

    2024年02月14日
    瀏覽(35)
  • 自然語(yǔ)言之文本預(yù)處理

    自然語(yǔ)言之文本預(yù)處理

    概念 分詞就是將連續(xù)的字序列按照一定的規(guī)范重新組合成詞序列的過(guò)程。在英文的行文中,單詞之間是以空格作為自然分界符的,而中文只是字、句和段能通過(guò)明顯的分界符來(lái)簡(jiǎn)單劃界,唯獨(dú)詞沒(méi)有一個(gè)形式上的分界符。分詞過(guò)程就是找到這樣分界符的過(guò)程. 作用 詞作為語(yǔ)言

    2024年02月06日
    瀏覽(27)
  • 【C語(yǔ)言:編譯、預(yù)處理詳解】

    【C語(yǔ)言:編譯、預(yù)處理詳解】

    我們都知道,一個(gè)程序如果想運(yùn)行起來(lái)要經(jīng)過(guò)編譯、鏈接然后才能生成.exe的文件。 編譯?可以分解為三個(gè)過(guò)程: 預(yù)處理(有些書(shū)也叫預(yù)編譯)、 編譯 匯編 預(yù)處理階段 主要處理那些源文件中以#開(kāi)始的預(yù)編譯指令。比如:#include,#define,處理的規(guī)則如下: 刪除所有的注釋

    2024年02月03日
    瀏覽(24)
  • <C語(yǔ)言> 預(yù)處理和宏

    <C語(yǔ)言> 預(yù)處理和宏

    這些預(yù)定義符號(hào)都是C語(yǔ)言內(nèi)置的。 舉個(gè)例子: #define 定義標(biāo)識(shí)符形式: 其中, 標(biāo)識(shí)符 是你希望定義的名稱,而 值 可以是一個(gè)數(shù)值、一個(gè)字符串或一個(gè)表達(dá)式。 例子: #define 只是進(jìn)行簡(jiǎn)單的文本替換,沒(méi)有類型檢查和錯(cuò)誤檢查。 建議 #define 后面不要加分號(hào) #define機(jī)制包括

    2024年02月14日
    瀏覽(22)
  • 【C語(yǔ)言進(jìn)階】預(yù)處理詳解

    【C語(yǔ)言進(jìn)階】預(yù)處理詳解

    對(duì)預(yù)處理的相關(guān)知識(shí)進(jìn)行詳細(xì)的介紹 ? ? ? ? ? ? ? ? ??? 豬巴戒 :個(gè)人主頁(yè)? ??????????????? 所屬專欄 :《C語(yǔ)言進(jìn)階》 ? ? ? ? ?? 跟著豬巴戒 ,一起學(xué)習(xí)C語(yǔ)言?? 目錄 引言 預(yù)定義符號(hào) #define定義常量 #define定義宏 帶有副作用的宏參數(shù) 宏替換的規(guī)則 宏函數(shù)的

    2024年01月23日
    瀏覽(26)
  • 【C語(yǔ)言】程序環(huán)境和預(yù)處理

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

    本章重點(diǎn) 程序的編譯環(huán)境 程序的執(zhí)行環(huán)境 詳解:C語(yǔ)言程序的編譯加鏈接 預(yù)定義符號(hào)介紹 預(yù)處理指令 #define 宏和函數(shù)的對(duì)比 預(yù)處理操作符#和##的介紹 命令定義 預(yù)處理指令 #include 預(yù)處理指令 #undef 條件編譯 程序的編譯環(huán)境和執(zhí)行環(huán)境 在ANSIC的任何一種實(shí)現(xiàn)中,存在兩種不同

    2024年01月21日
    瀏覽(53)
  • C語(yǔ)言:程序環(huán)境和預(yù)處理

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

    目錄 一,程序的翻譯環(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 查看預(yù)處理 3.2.2 #define 定義標(biāo)識(shí)符 ?3.2.3?#define 定義宏 ?3.2.4#define 替換規(guī)則 3.25#和## ?1.# 2.## 3.2.6 帶副作用的宏參數(shù) 3.2.7 宏和函數(shù)對(duì)

    2024年02月10日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包