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

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

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

目錄

一,程序的翻譯環(huán)境

二,詳解編譯+鏈接

?2.1 翻譯環(huán)境

?2.2 程序編譯的過程

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ì)比

3.2.8 命名約定

3.3 #undef

3.4 條件編譯

?1. # if ~#endif

?2.多分枝條件編譯

?3.判斷是否被定義

?4.嵌套指令

?3.5 文件包含

3.5.1 頭文件被包含的方式:?


一,程序的翻譯環(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í)行代碼。

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

二,詳解編譯+鏈接 ?

?2.1 翻譯環(huán)境

程序編譯過程:

組成一個(gè)程序的每個(gè)源文件通過編譯過程分別轉(zhuǎn)換成目標(biāo)代碼(object code)。

每個(gè)目標(biāo)文件鏈接器(linker)捆綁在一起,形成一個(gè)單一而完整的可執(zhí)行程序。

鏈接器同時(shí)也會(huì)引入標(biāo)準(zhǔn)C函數(shù)庫中任何被該程序所用到的函數(shù),而且它可以搜索程序員個(gè)人 的程序庫,將其需要的函數(shù)也鏈接到程序中。

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?2.2 程序編譯的過程

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

預(yù)處理

要想生成可執(zhí)行程序,進(jìn)行編譯中的預(yù)處理是必不可少的,那什么又是干了什么呢?

其實(shí)在預(yù)處理的過程中是將test.c文件的內(nèi)容經(jīng)過處理重新放在了,test.i文件中。

test.i文件的部分操作

1 將test.c文件中包含#include的庫內(nèi)容放在test.i中。

2 將#define定義的符號(hào)替換,刪除定義的注釋。

編譯

在該過程中主要是進(jìn)行C語言的代碼轉(zhuǎn)換為匯編代碼。

在轉(zhuǎn)換的過程中主要是進(jìn)行C語言代碼的:語法分析,詞法分析,符號(hào)匯總,語意分析等操作。

同時(shí)這時(shí)也會(huì)生成一個(gè)test.s文件記錄當(dāng)前的更改。

匯編

在該過程中主要是將匯編代碼轉(zhuǎn)化為二進(jìn)制的指令,形式符號(hào)表,生成了可重新定位的目標(biāo)文件test.o。

什么又是符號(hào)表呢?

#include<stdio.h>
 
int Add(int x, int y)
{
	return x + y;
}
 
int main()
{
	int a = 5;
	int b = 10;
	Add(a,b);

	return 0;
}

每個(gè)項(xiàng)目文件都有自己的符號(hào)表

?C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?符號(hào)表:

1.合并段表,將匯編過程中的一一合并

1.符號(hào)表的合并和重定義

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

通過鏈接庫后生成鏈接庫?

1. 預(yù)處理 選項(xiàng) gcc -E test.c -o test.i
????????預(yù)處理完成之后就停下來,預(yù)處理之后產(chǎn)生的結(jié)果都放在test.i文件中。
2. 編譯 選項(xiàng) gcc -S test.c
????????編譯完成之后就停下來,結(jié)果保存在test.s中。
3. 匯編 gcc -c test.c
????????匯編完成之后就停下來,結(jié)果保存在test.o中。

2.3 運(yùn)行環(huán)境 ?

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

三,預(yù)處理詳解 ?

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

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

?舉例:

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

__func__ 當(dāng)前編譯的函數(shù)

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

//可以相當(dāng)于日志寫進(jìn)文件中
#include <stdio.h>

int main()
{
	int i;
	FILE* pf = fopen("long.txt", 'a');
	if (pf == NULL)
	{
		return 1;
	}
	for (i = 0;i < 10;i++)
	{
		printf("name:%s line:%d date:%s i=%d\n", __func__, __LINE__, __DATE__, i);
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

3.2 #define ?

語法:
#define name stuff?

#define:1.定義標(biāo)識(shí)符常量 2.定義宏

3.2.1 查看預(yù)處理

?C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

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

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

在預(yù)處理階段已經(jīng)完成替換?

?簡化代碼:

#define reg register

int main()
{
	int reg num = 100;// int register num=100;

	return 0;
}

這樣也是可以的:
#define DEBUG_PRINT printf("file:%s\tline:%d\t \date:%s\ttime:%s\n" ,\__FILE__,__LINE__ , \__DATE__,__TIME__ )

在define定義標(biāo)識(shí)符的時(shí)候,要不要在最后加上 ; ?
#define MAX 1000;
#define MAX 1000
當(dāng)然時(shí)不能的

除非對(duì)某長變量賦值時(shí)末尾不加;

如圖:C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言


?3.2.3?#define 定義宏

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

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

?問題代碼:

#define SQUARE(x) x * x


int a = 5;
printf("%d\n" ,SQUARE(a + 1));//11

?乍一看,你可能覺得這段代碼將打印36這個(gè)值。事實(shí)上,它將打印11 為什么呢?

替換文本時(shí),參數(shù)x被替換成a + 1,所以這條語句實(shí)際上變成了:

a + 1 * a + 1 


這樣就比較清晰了,由替換產(chǎn)生的表達(dá)式并沒有按照預(yù)想的次序進(jìn)行求值。
在宏定義上加上兩個(gè)括號(hào),這個(gè)問題便輕松的解決了:

#define SQUARE(x) (x) * (x)

?定義中我們使用了括號(hào),想避免之前的問題,但是這個(gè)宏可能會(huì)出現(xiàn)新的錯(cuò)誤

int a = 5;
printf("%d\n" ,10 * DOUBLE(a));

?這將打印什么值呢?
warning:
看上去,好像打印100,但事實(shí)上打印的是55.
我們發(fā)現(xiàn)替換之后:

10 * (5) + (5)

乘法運(yùn)算先于宏定義的加法,所以出現(xiàn)了55

這個(gè)問題,的解決辦法是在宏定義表達(dá)式兩邊加上一對(duì)括號(hào)就可以了

#define DOUBLE(x) ((x) + (x))

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


?3.2.4#define 替換規(guī)則

?在程序中擴(kuò)展#define定義符號(hào)和宏時(shí),需要涉及幾個(gè)步驟。
1. 在調(diào)用宏時(shí),首先對(duì)參數(shù)進(jìn)行檢查,看看是否包含任何由#define定義的符號(hào)。如果是,它們首先被替換。
2. 替換文本隨后被插入到程序中原來文本的位置。對(duì)于宏,參數(shù)名被他們的值所替換。
3. 最后,再次對(duì)結(jié)果文件進(jìn)行掃描,看看它是否包含任何由#define定義的符號(hào)。如果是,就重復(fù)上述處理過程。

注意:
1. 宏參數(shù)和#define 定義中可以出現(xiàn)其他#define定義的符號(hào)。但是對(duì)于宏,不能出現(xiàn)遞歸。
2. 當(dāng)預(yù)處理器搜索#define定義的符號(hào)的時(shí)候,字符串常量的內(nèi)容并不被搜索

3.25#和##
?

?1.#
char* p = "hello ""word\n";
printf("hello"" word\n");
printf("%s", p);

此處二者輸出依舊位helloword

這里只有當(dāng)字符串作為宏參數(shù)的時(shí)候才可以把字符串放在字符串中。
另外一個(gè)技巧是:
使用 # ,把一個(gè)宏參數(shù)變成對(duì)應(yīng)的字符串

#include <stdio.h>

#define PRINT(N) printf("The value of "#N" is %d\n",N)
int main()
{
	int a = 10;
	int b = 20;

	PRINT(a);
	PRINT(b);

	return 0;
}

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言
?


#include <stdio.h>

#define PRINT(N,format) printf("The value of "#N" is "format"\n",N)
int main()
{
	int a = 20;
	double pai = 3.14;

	PRINT(a, "%d");
	PRINT(pai, "%lf");

	return 0;
}

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

2.##

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

#include <stdio.h>

#define CAT(name,num) name##num
int main()
{
	int class105 = 105;
	printf("%d\n",CAT(class,105));//合并->class105->%d->105

	return 0;
}

?C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?注:
????????這樣的連接必須產(chǎn)生一個(gè)合法的標(biāo)識(shí)符。否則其結(jié)果就是未定義的

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

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

x+1;//不帶副作用
x++;//帶有副作用

MAX宏可以證明具有副作用的參數(shù)所引起的問題。

#include <stdio.h>

#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);//輸出的結(jié)果是什么?

	return 0;
}
z = ( (x++) > (y++) ? (x++) : (y++));

結(jié)果是:C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

z = ( (x++) > (y++) ? (x++) : (y++));
第一個(gè)x
x++ -> 5
第一個(gè)y
y++ -> 9

第二個(gè)進(jìn)行xy比較
x++ <y++ -> 6<9 (只用于比較)

z=y=9 

?所以要避免這樣寫

3.2.7 宏和函數(shù)對(duì)比
?

?宏通常被應(yīng)用于執(zhí)行簡單的運(yùn)算

#define MAX(a, b) ((a)>(b)?(a):(b))

那為什么不用函數(shù)來完成這個(gè)任務(wù)?
原因有二:
????????1. 用于調(diào)用函數(shù)和從函數(shù)返回的代碼可能比實(shí)際執(zhí)行這個(gè)小型計(jì)算工作所需要的時(shí)間更多。所以宏比函數(shù)在程序的規(guī)模和速度方面更勝一籌。
????????2. 更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。
所以函數(shù)只能在類型合適的表達(dá)式上使用。反之這個(gè)宏怎可以適用于整形、長整型、浮點(diǎn)型等可以用于>來比較的類型。宏是類型無關(guān)的。

宏的缺點(diǎn):當(dāng)然和函數(shù)相比宏也有劣勢的地方:
1. 每次使用宏的時(shí)候,一份宏定義的代碼將插入到程序中。除非宏比較短,否則可能大幅度增加程序的長度。
2. 宏是沒法調(diào)試的.

3. 宏由于類型無關(guān),也就不夠嚴(yán)謹(jǐn)。
4. 宏可能會(huì)帶來運(yùn)算符優(yōu)先級(jí)的問題,導(dǎo)致程容易出現(xiàn)錯(cuò)。

宏有時(shí)候可以做函數(shù)做不到的事情。比如:宏的參數(shù)可以出現(xiàn)類型,但是函數(shù)做不到。
?

#include <stdio.h>
#include <stdlib.h>

#define MALLOC(num,type) (type* )malloc(num*sizeof(type))
int main()
{
	// 每次要都要重新申請(qǐng)空間
	int* p = (int*)malloc(10 * sizeof(int));

	//用#define簡化
	MALLOC(10,int);
	//int* p = (int*)malloc(10 * sizeof(int));

	return 0;
}
屬 性 #define定義宏 函數(shù)
代 碼 長 度 每次使用時(shí),宏代碼都會(huì)被插入到程序中。除了非常小的宏之外,程序的長度會(huì)大幅度增長 函數(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ù)
測。
帶 有 副 作 用 的 參 數(shù) 參數(shù)可能被替換到宏體中的多個(gè)位置,所以帶有副作
用的參數(shù)求值可能會(huì)產(chǎn)生不可預(yù)料的結(jié)果。
函數(shù)參數(shù)只在傳參的時(shí)候求值一
次,結(jié)果更容易控制。
參 數(shù) 類 型 宏的參數(shù)與類型無關(guān),只要對(duì)參數(shù)的操作是合法的,
它就可以使用于任何參數(shù)類型。
函數(shù)的參數(shù)是與類型有關(guān)的,如
果參數(shù)的類型不同,就需要不同
的函數(shù),即使他們執(zhí)行的任務(wù)是
不同的。
調(diào) 試 宏是不方便調(diào)試的 函數(shù)是可以逐語句調(diào)試的
遞 歸 宏是不能遞歸的 函數(shù)是可以遞歸的

3.2.8 命名約定


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

3.3 #undef ?

這條指令用于移除一個(gè)宏定義。

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

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言
?

3.4 條件編譯 ?

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

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?1. # if ~#endif

#if +常量表達(dá)式

#include <stdio.h>
#define __DEBUG__ 1
int main()
{
	
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0;i < 10;i++)
	{
		arr[i] = i + 1;
#if 1+2
		printf("%d\n",arr[i]);

#endif

#if __DEBUG__ //常量表達(dá)式
		printf("%d\n", arr[i]);

#endif

	}
	return 0;
}

?2.多分枝條件編譯

#if 常量表達(dá)式
//...
#elif 常量表達(dá)式
//...
#else
//...
#endif

?C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?3.判斷是否被定義

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

#include <stdio.h>

#define MAX 0
int main()
{
#if defined(MAX)
	printf("hehe");
#endif

#ifdef MAX //與 #if defined(MAX)效果相同
	printf("hehe");
#endif

	return 0;
}

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?4.嵌套指令

C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

?3.5 文件包含

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

3.5.1 頭文件被包含的方式:
?

本地文件包含:

#include "filename"

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

1.Linux環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:
/usr/include

2.VS環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
//這是VS2013的默認(rèn)路徑

3.庫文件包含
#include <filename.h>

查找頭文件直接去標(biāo)準(zhǔn)路徑下去查找,如果找不到就提示編譯錯(cuò)誤。這樣是不是可以說,對(duì)于庫文件也可以使用 “ ” 的形式包含?答案是肯定的,可以
?但是這樣做查找的效率就低些,當(dāng)然這樣也不容易區(qū)分是庫文件還是本地文件了。

?C語言:程序環(huán)境和預(yù)處理,c語言,開發(fā)語言

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ù)。

那我們又改如何解決這些問題題呢?其實(shí)我們就可以用我們剛剛學(xué)的條件編譯去解決這個(gè)問題。

#ifndef __TEST_H__ //如果是第一次定義該符號(hào)
//為真進(jìn)行定義,若為假則跳過

#define __TEST_H__ 
//頭文件的內(nèi)容
#endif   //__TEST_H__

?或者:

#pragma once

?這樣我們就能避免頭文件的重復(fù)引用。

若覺得對(duì)大家有用的話請(qǐng)給個(gè)免費(fèi)的贊啦!??????文章來源地址http://www.zghlxwxcb.cn/news/detail-693223.html

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

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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語言進(jìn)階】程序環(huán)境和預(yù)處理

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

    ?? 博客主頁: 小王又困了 ?? 系列專欄: C語言 ?? 人之為學(xué),不日近則日退? ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 目錄 一、程序的翻譯環(huán)境和執(zhí)行環(huán)境 二、詳解編譯和鏈接 2.1翻譯環(huán)境 2.2編譯的過程 ?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語言程序的編譯+鏈接)--2

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

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

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

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

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

    2024年02月08日
    瀏覽(28)
  • 程序環(huán)境和預(yù)處理(詳解)

    程序環(huán)境和預(yù)處理(詳解)

    ??博客主頁:?自信不孤單 ??文章專欄:C語言 ??代碼倉庫:破浪曉夢 ??歡迎關(guān)注:歡迎大家點(diǎn)贊收藏+關(guān)注 本文重點(diǎn) 代碼編譯鏈接變成可執(zhí)行程序程序的過程 掌握學(xué)習(xí)各種預(yù)處理知識(shí) 在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境: 翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被

    2023年04月27日
    瀏覽(23)
  • 【C】程序環(huán)境和預(yù)處理

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

    在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。 第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 第2種是執(zhí)行環(huán)境,它用于實(shí)際執(zhí)行代碼。 翻譯環(huán)境我們主要解釋一下編譯和鏈接過程。 我們的源文件也就是我們的.c文件通過編譯器生成一個(gè)目標(biāo)文件(

    2024年02月16日
    瀏覽(23)
  • 程序環(huán)境和預(yù)處理(上)——“C”

    程序環(huán)境和預(yù)處理(上)——“C”

    各位CSDN的uu們你們好呀,今天小雅蘭的內(nèi)容是C語言中的程序環(huán)境和預(yù)處理這個(gè)知識(shí)點(diǎn),這塊知識(shí)點(diǎn)是小雅蘭地C語言的最后一塊知識(shí)點(diǎn)了,以后可能會(huì)更新一些C語言的書籍的閱讀,比如:《C? Primer? Plus》和《C語言深度剖析》。好啦,讓我們進(jìn)入程序環(huán)境和預(yù)處理的世界吧。

    2023年04月09日
    瀏覽(19)
  • 程序環(huán)境和預(yù)處理(下)——“C”

    程序環(huán)境和預(yù)處理(下)——“C”

    各位CSDN的uu們你們好呀,今天小雅蘭的內(nèi)容是程序環(huán)境和預(yù)處理的下篇知識(shí)點(diǎn),那么,這篇博客寫完后,C語言的知識(shí)點(diǎn)就到這里就結(jié)束啦,后續(xù)會(huì)專注于刷題和讀書,也是關(guān)于C語言的,會(huì)寫一些數(shù)據(jù)結(jié)構(gòu)和C++的內(nèi)容,好啦,讓我們進(jìn)入程序環(huán)境和預(yù)處理的世界吧 預(yù)處理詳解

    2023年04月16日
    瀏覽(21)
  • 程序員進(jìn)階之路:程序環(huán)境和預(yù)處理

    程序員進(jìn)階之路:程序環(huán)境和預(yù)處理

    ? 目錄 ? 前言 程序的翻譯環(huán)境和執(zhí)行環(huán)境 翻譯環(huán)境 運(yùn)行環(huán)境 預(yù)處理(預(yù)編譯) 預(yù)定義符號(hào) #define #define 定義標(biāo)識(shí)符 #define 定義宏 ?#define 替換規(guī)則 ?#和## ?#的作用 ##的作用 ?帶副作用的宏參數(shù) ?宏和函數(shù)對(duì)比 命名約定 ?#undef 命令行定義 條件編譯? 文件包含 ?嵌套文件包

    2024年02月16日
    瀏覽(26)
  • 015+limou+C語言深入知識(shí)——(7)編譯環(huán)境和運(yùn)行環(huán)境以及預(yù)處理指令

    015+limou+C語言深入知識(shí)——(7)編譯環(huán)境和運(yùn)行環(huán)境以及預(yù)處理指令

    在這個(gè)環(huán)境中,源代碼被轉(zhuǎn)化為可執(zhí)行的機(jī)器指令(二進(jìn)制指令) 單文件簡易版本 多文件簡易版本 編譯鏈接詳細(xì)版本 VS2022集成IDE(windows下)的編譯器叫cl.exe,鏈接器叫l(wèi)ink.exe gcc編譯器(windows下)的幾個(gè)有關(guān)編譯環(huán)境的命令 (1)符號(hào)表會(huì)把全局變量和具有外部鏈接的函數(shù)

    2023年04月11日
    瀏覽(22)
  • 【C語言深入】深入理解程序的預(yù)處理過程

    【C語言深入】深入理解程序的預(yù)處理過程

    我們平時(shí)所寫的每一個(gè).c文件都會(huì)經(jīng)過編譯和連接的過程之后才會(huì)形成一個(gè)可執(zhí)行程序: 今天我們就來詳細(xì)的看看編譯和連接這兩個(gè)過程的具體細(xì)節(jié)。 程序的翻譯環(huán)境與執(zhí)行環(huán)境 在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。 第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換

    2023年04月08日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包