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

C語(yǔ)言函數(shù)調(diào)用底層實(shí)現(xiàn)原理分析

 更新時(shí)間:2023年02月24日 10:43:35   作者:Real返璞歸真  
這篇文章主要介紹了C語(yǔ)言函數(shù)調(diào)用底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

C語(yǔ)言程序執(zhí)行實(shí)質(zhì)上的函數(shù)的連續(xù)調(diào)用。

運(yùn)行程序時(shí),系統(tǒng)通過(guò)程序入口調(diào)用main函數(shù),在main函數(shù)中又不斷調(diào)用其它函數(shù)。

程序的每個(gè)進(jìn)程都包括一個(gè)調(diào)用棧結(jié)構(gòu)(Call Stack)。

調(diào)用棧的作用:

  • 傳遞函數(shù)參數(shù)
  • 保存返回地址
  • 臨時(shí)保存寄存器原有值(保存現(xiàn)場(chǎng))

寄存器分配

寄存器指CPU中可以進(jìn)行高速運(yùn)算的緩沖區(qū)。用于存放程序執(zhí)行中用到的數(shù)據(jù)和指令。

Intel 32位結(jié)構(gòu)寄存器(IA32)包含8個(gè)通用寄存器,每個(gè)寄存器4個(gè)字節(jié)(32位)。

通用寄存器按照AT&T語(yǔ)法,寄存器名以**%e**開(kāi)頭。

若按照Intel語(yǔ)法,寄存器名直接按e開(kāi)頭。

通用寄存器包括:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP

數(shù)據(jù)寄存器:EAX、EBX、ECX、EDX

變址寄存器:ESI、EDI

指針寄存器:ESP、EBP

X86架構(gòu)中,EIP寄存器指向下一條待執(zhí)行的命令地址。

ESP是棧指針寄存器,指向當(dāng)前棧幀的棧頂。

EBP是棧幀基址寄存器,指向當(dāng)前棧幀的基地址

不同架構(gòu)的cpu寄存器名前綴不同。

例如:x86架構(gòu)的寄存器用字母e作為前綴(extended),表明寄存器大小是32位。

x86_64架構(gòu)用字母r作為前綴,表明寄存器大小是64位。

ABI協(xié)議規(guī)定了寄存器、堆棧的使用規(guī)則以及參數(shù)傳遞規(guī)則。用于約束硬件與系統(tǒng)之間的通信協(xié)議。編譯器必須按照ABI給出的寄存器功能定義,將C程序轉(zhuǎn)為匯編程序。

寄存器使用約定

寄存器是唯一能被被所有函數(shù)共享的資源。因此,在函數(shù)中調(diào)用其它函數(shù)時(shí),需要考慮到數(shù)據(jù)的保存與覆蓋問(wèn)題(即防止被調(diào)函數(shù)直接修改寄存器導(dǎo)致主調(diào)函數(shù)的數(shù)據(jù)被覆蓋)。

IA32采用了統(tǒng)一的寄存器使用約定,所有函數(shù)必須遵守。

  • EAX、ECX、EDX為主調(diào)函數(shù)保存寄存器,即在調(diào)用被調(diào)函數(shù)之前,主調(diào)函數(shù)如果希望保存這三個(gè)寄存器的數(shù)據(jù),需要將數(shù)據(jù)保存到堆棧中,然后調(diào)用被調(diào)函數(shù)。
  • EBX、ESI、EDI是被調(diào)函數(shù)保存寄存器,被調(diào)函數(shù)如果向使用這三個(gè)寄存器,需要先將其中的數(shù)據(jù)保存到堆棧中,然后操作寄存器,最后將堆棧中的數(shù)據(jù)還原。
  • EBP和ESP指向當(dāng)前的棧,每個(gè)函數(shù)對(duì)應(yīng)一個(gè)棧幀。被調(diào)函在返回前,需將主調(diào)函數(shù)的棧幀還原。即恢復(fù)到調(diào)用前的狀態(tài)。

棧幀結(jié)構(gòu)

注意,程序的棧從高地址向低地址增長(zhǎng)!

函數(shù)調(diào)用由堆棧進(jìn)行處理,每個(gè)函數(shù)都單獨(dú)在堆棧中占用一塊連續(xù)的區(qū)域。這塊區(qū)域叫做每個(gè)函數(shù)的棧幀。棧幀是堆棧的邏輯片段。

棧幀中保存 傳入的參數(shù) 局部變量 和 用于返回上一棧幀的信息。

棧幀的邊界由EBP和ESP決定。EBP指向棧幀的底部(高地址),ESP指向棧頂?shù)刂罚ǖ偷刂罚?/strong>。ESP可以看作是EBP的偏移量,始終指向棧幀的頂部。

EBP為幀基指針,ESP為棧頂指針。

函數(shù)調(diào)用棧演示如下:

參數(shù)2
參數(shù)1
主調(diào)函數(shù)返回地址(EIP)
主調(diào)函數(shù)棧幀基址(EBP)
被調(diào)函數(shù)保存寄存器(可選)
局部變量1
局部變量2

函數(shù)被調(diào)用時(shí),壓棧的順序:

參數(shù)2 -> 參數(shù)1 -> 主調(diào)函數(shù)返回地址 -> 主調(diào)函數(shù)棧幀基址 -> 被調(diào)函數(shù)保存寄存器(可選) -> 局部變量 -> 局部變量2

注意,參數(shù)是從右向左依次入棧。

參數(shù)壓棧完成后,緊接著被壓入的是EIP指針?biāo)赶虻牡刂?/strong>,也就是主調(diào)函數(shù)下一個(gè)要執(zhí)行的命令的地址。(用于被調(diào)函數(shù)執(zhí)行完后繼續(xù)執(zhí)行程序)

然后,將主調(diào)函數(shù)EBP棧幀基地址壓入棧幀,用于還原現(xiàn)場(chǎng)。并把ESP賦值給EBP,使EBP成為被調(diào)函數(shù)的棧幀基地址。

繼續(xù),改變SP的值,給被調(diào)函數(shù)局部變量預(yù)留空間。

這時(shí)候,EBP指向被調(diào)函數(shù)的棧底,向上是主調(diào)函數(shù)返回地址,向下是局部變量。該地址還保存主調(diào)函數(shù)的棧幀基址。

函數(shù)調(diào)用結(jié)束后,EBP賦值給ESP,使ESP指向被調(diào)函數(shù)棧底,釋放被調(diào)函數(shù)局部變量。再將主調(diào)函數(shù)棧幀基地址彈出給EBP,并彈出返回地址到EIP。

堆棧操作

函數(shù)調(diào)用流程

函數(shù)調(diào)用時(shí)的具體操作:

  1. 主調(diào)函數(shù)按照約定,將參數(shù)壓入棧中。(x86將參數(shù)壓入棧幀,x86_64具有16個(gè)通用寄存器,前六個(gè)參數(shù)通常由寄存器保存,其余參數(shù)壓入棧中。)
  2. 主調(diào)函數(shù)將控制權(quán)轉(zhuǎn)給被調(diào)函數(shù),返回地址(EIP)保存在棧中(在call指令中執(zhí)行)。
  3. 被調(diào)函數(shù)設(shè)置棧幀基址,即用ESP給EBP賦值。
  4. 若有必要,保存被調(diào)函數(shù)希望保持的寄存器的數(shù)據(jù)。
  5. 被調(diào)函數(shù)修改棧頂指針,為局部變量預(yù)留空間。并向低地址方向開(kāi)始存放局部變量和臨時(shí)變量。
  6. 被調(diào)函數(shù)執(zhí)行任務(wù),若被調(diào)函數(shù)返回值,一般存放在EAX中。
  7. 棧頂指針指向EBP,釋放局部變量空間。
  8. 恢復(fù)4中保存的主調(diào)函數(shù)寄存器中的數(shù)據(jù)。并恢復(fù)3中的棧幀基址。
  9. 被調(diào)函數(shù)控制權(quán)交還給主調(diào)函數(shù)(ret指令),也可能清除參數(shù)。
  10. 主調(diào)函數(shù)得到控制器,可能將棧上的參數(shù)清除。

函數(shù)調(diào)用常用命令

壓棧(push):棧頂指針減小4個(gè)字節(jié),以字節(jié)為單位將數(shù)據(jù)壓入棧中。(不足補(bǔ)0)

出棧(pop):棧頂指針數(shù)據(jù)被取回,ESP增大4個(gè)字節(jié)。

調(diào)用(call):將EIP(call的下一條指令地址)壓入棧幀,然后EIP指向被調(diào)函數(shù)代碼開(kāi)始處。

離開(kāi)(leave):恢復(fù)主調(diào)函數(shù)棧幀,等價(jià)于 mov ebp esp 、pop ebp

返回(ret):與call對(duì)應(yīng),從棧頂彈出返回地址給EIP。繼續(xù)執(zhí)行程序。

C調(diào)用約定典型的函數(shù)序函數(shù)跋如下:

指令序列含義
函數(shù)序(prologue)push %ebp將主調(diào)函數(shù)?;羔榚bp壓棧,即保存舊棧幀基址以便函數(shù)返回時(shí)恢復(fù)舊棧幀。
mov %esp %ebp將主調(diào)函數(shù)棧頂指針賦值給ebp,此時(shí),ebp執(zhí)行被調(diào)函數(shù)棧幀底部。
sub %esp將棧頂指針下移,為局部變量開(kāi)辟空間,n通常為16的倍數(shù),以便于字節(jié)對(duì)齊進(jìn)行編譯優(yōu)化。
push可選,如有必要,被調(diào)函數(shù)保存某些寄存器的值(ebx,edi,esi)
函數(shù)跋(epilogue)pop®可選,如有必要,被調(diào)函數(shù)恢復(fù)某些寄存器的值(ebx,edi,esi)
mov %ebp %esp*恢復(fù)主調(diào)函數(shù)棧頂指針esp,將其指向被調(diào)函數(shù)棧底。局部變量空間被釋放,但數(shù)據(jù)未清除。
pop %ebp恢復(fù)主調(diào)函數(shù)棧幀基地址,此時(shí),esp指向返回地址存放處。
ret從棧中彈出返回地址到eip,繼續(xù)執(zhí)行主調(diào)函數(shù)。再由主調(diào)函數(shù)恢復(fù)棧。
*:這兩條指令序列也可以由leave實(shí)現(xiàn),具體方式由編譯器決定。

C語(yǔ)言函數(shù)調(diào)用的兩種壓棧方式:

壓棧方式一壓棧方式二
push 4push 3push 2push 1call CdeclDemoadd $16, %ebpsub $16, %espmov $4, 12(%esp)mov $3, 8(%esp)mov $2, 4(%esp)mov $1, (%esp)call CdeclDemo

兩種壓棧方式區(qū)別:

方式一是傳統(tǒng)方式,一個(gè)參數(shù)一個(gè)參數(shù)的壓棧,然后調(diào)用,最后釋放棧。

方式二是預(yù)先開(kāi)辟空間,然后將參數(shù)復(fù)制到空間,最后沒(méi)有回收空間。

函數(shù)調(diào)用約定

創(chuàng)建棧幀最重要的步驟是參數(shù)的傳遞。函數(shù)選擇特定調(diào)用約定,以特定方式進(jìn)行參數(shù)傳遞。調(diào)用約定還規(guī)定在函數(shù)調(diào)用結(jié)束后,由主調(diào)函數(shù)還是被調(diào)函數(shù)對(duì)棧進(jìn)行清理。

函數(shù)調(diào)用約定包括以下方面:

  • 函數(shù)參數(shù)傳遞順序和方式
  • 棧的維護(hù)方式
  • 名字修飾策略

常見(jiàn)調(diào)用約定

cdecl調(diào)用約定

別名 C調(diào)用約定,C/C++編譯器默認(rèn)調(diào)用約定。

所有非C++成員函數(shù),和未使用stdcall、fastcall聲明的函數(shù)默認(rèn)都是cdecl調(diào)用。

參數(shù)按照從右向左的順序入棧,主調(diào)函數(shù)負(fù)責(zé)清空棧,返回值保存在EAX中。

cdecl調(diào)用支持可變參數(shù)函數(shù),對(duì)于C函數(shù),名字修飾是在函數(shù)名前加 _ 。

對(duì)于C++,除非使用**extern"C"**修飾,否則有不同的名字修飾方法。

stdcall調(diào)用約定(微軟命名)

Pascal程序缺省調(diào)用方式,WinAPI也多采用該調(diào)用約定。

參數(shù)從右向左入棧,被調(diào)函數(shù)負(fù)責(zé)清空棧,返回值保存在EAX。

stdcall僅適用于參數(shù)個(gè)數(shù)固定的函數(shù),因?yàn)楸徽{(diào)函數(shù)無(wú)法知道棧上參數(shù)個(gè)數(shù)。

C函數(shù)中,stdcall的名字修飾是在名字前加_,在名字后加@和參數(shù)大小。

fastcall調(diào)用約定

stdcall的變形,通常使用ECX、EDX寄存器傳遞前兩個(gè)DWORD(四字節(jié)雙字)類型或更少的字節(jié)的函數(shù)參數(shù),其余從右向左入棧。

被調(diào)函數(shù)負(fù)責(zé)清空棧中參數(shù)。返回值保存在EAX中。

函數(shù)名兩邊使用@修飾,并在后面用十進(jìn)制表示參數(shù)列表大?。ㄗ止?jié))。

thiscall調(diào)用約定

C++類的非靜態(tài)成員函數(shù)必須接收一個(gè)主調(diào)對(duì)象的指針(this指針),并頻繁的使用該指針。編譯器默認(rèn)使用thiscall調(diào)用約定提高調(diào)用效率。

參數(shù)按照從右向左的順序入棧。

若參數(shù)數(shù)目固定,this指針通過(guò)ECX傳遞,被調(diào)函數(shù)負(fù)責(zé)清理堆棧。

若參數(shù)數(shù)目不固定,this指針在所有參數(shù)入棧后再入棧,主調(diào)函數(shù)清理堆棧。

thiscall不是C++關(guān)鍵字,不能用于修飾函數(shù),只能由編譯器使用。

naked call調(diào)用約定

naked call調(diào)用,編譯器不產(chǎn)生保存和恢復(fù)寄存器的代碼。也不能使用return語(yǔ)句。

只能使用內(nèi)嵌的匯編返回結(jié)果。用于某些特殊場(chǎng)合,如非C/C++上下文中的函數(shù),程序員需自行編寫初始化和清棧的內(nèi)嵌匯編指令。

pascal調(diào)用約定

Pascal語(yǔ)言調(diào)用約定,參數(shù)從右向左入棧。只支持固定數(shù)量參數(shù)。

被調(diào)函數(shù)清理堆棧,函數(shù)名稱無(wú)修飾且全部大寫。

上述約定的特點(diǎn):

調(diào)用方式stdcall(Win32)cdeclfastcallthiscall(C++)naked call
參數(shù)壓棧順序從右至左從右至左自定義,Arg1在ecx,Arg2在edx從右至左,this指針在ecx自定義
參數(shù)位置棧 + 寄存器棧,寄存器ecx自定義
負(fù)責(zé)清棧函數(shù)被調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)自定義
支持可變參數(shù)自定義
函數(shù)名字格式_name@number_name@name@number自定義
參數(shù)表開(kāi)始特征“@@YG”“@@YA”“@@YI”自定義
注:C++因支撐函數(shù)重載、命名空間和成員函數(shù)等語(yǔ)法特征,采用更為復(fù)雜的名字修飾策略。C++函數(shù)修飾名以"?“開(kāi)始,后面緊跟函數(shù)名、參數(shù)表開(kāi)始標(biāo)識(shí)和按照類型代號(hào)拼出的返回值參數(shù)表。例如,函數(shù)int Function(char *var1,unsigned long)對(duì)應(yīng)的stdcall修飾名為”?Function@@YGHPADK@Z"。

Windows下可直接在函數(shù)聲明前添加關(guān)鍵字__stdcall、__cdecl或__fastcall等標(biāo)識(shí)確定函數(shù)的調(diào)用方式,如int __stdcall func()。

Linux下可借用函數(shù)attribute 機(jī)制,如int attribute((stdcall)) func()。

被調(diào)函數(shù)CalleeFunc分別聲明為cdecl、stdcall和fastcall約定時(shí),匯編代碼比較:

cdeclstdcallfastcall
主調(diào)函數(shù)職責(zé)sub $0xc, %espmov $0x33, 0x8(%esp)mov $0x22, 0x4(%esp)mov $0x11,(%esp)call 8048354sub $0xc, %espmov $0x33, 0x8(%esp)mov $0x22, 0x4(%esp)mov $0x11,(%esp)call 8048354 sub $0xc, %espsub $0x4,%esp movl $0x33,(%esp) mov $0x22,%edx mov $0x11,%ecx call 8048354 sub $0x4,%esp
被調(diào)函數(shù)職責(zé)push %ebpmov %ebp %espmov 0xc(%ebp), %eaxadd 0x8(%ebp), %eaxadd 0x10(%ebp), %eaxpop %ebpretpush %ebpmov %ebp %espmov 0xc(%ebp), %eaxadd 0x8(%ebp), %eaxadd 0x10(%ebp), %eaxpop %ebpret $0xc 執(zhí)行ret指令并清理參數(shù)占用的堆棧(棧頂指針上移參數(shù)個(gè)數(shù)*4=12個(gè)字節(jié),以釋放壓棧的參數(shù))push %ebp mov %esp,%ebp sub $0x8,%esp mov %ecx,0xfffffffc(%ebp) mov %edx,0xfffffff8(%ebp) mov 0xfffffff8(%ebp),%eax add 0xfffffffc(%ebp),%eax add 0x8(%ebp),%eax leave ret $0x4 //ret <壓棧參數(shù)字節(jié)數(shù)>。若參數(shù)不超過(guò)兩個(gè),則ret指令不帶立即數(shù),因?yàn)闊o(wú)參數(shù)被壓棧

調(diào)用約定影響

不同編譯器產(chǎn)生棧幀的方式不盡相同,主調(diào)函數(shù)不一定能完成清理堆棧的工作,而被調(diào)函數(shù)一定可以。

同時(shí),為了保證不同平臺(tái)堆棧正常,一般使用stdcall調(diào)用。(通常用于A語(yǔ)言調(diào)用B語(yǔ)言函數(shù)

此外,主調(diào)函數(shù)和被調(diào)函數(shù)采用相同調(diào)用約定,但分別使用C和C++時(shí),會(huì)出現(xiàn)鏈接錯(cuò)誤。

這是因?yàn)椋簝煞N語(yǔ)言函數(shù)名稱修飾符不一樣。解決方法是使用**extern “C”**修飾被調(diào)函數(shù)。

同時(shí)應(yīng)該考慮,被調(diào)函數(shù)也有可能是C++編譯的。通常這樣聲明頭文件:

#ifdef _cplusplus
     extern "C" {
#endif
     type Func(type para);
#ifdef _cplusplus
     }
#endif

x86函數(shù)傳遞參數(shù)方法

x86處理器的ABI規(guī)范中規(guī)定,所有參數(shù)從右向左壓入棧中。

整型和指針參數(shù)傳遞

整型參數(shù)指針參數(shù)傳遞方式相同,在32位的x86處理器上整型與指針大小相同(四個(gè)字節(jié))。

下表給出這兩種類型在棧幀中位置關(guān)系:

調(diào)用語(yǔ)句參數(shù)棧幀地址
tail(1, 2, 3, (void *)0);18(%ebp)
212(%ebp)
316(%ebp)
(void *)020(%ebp)

浮點(diǎn)參數(shù)傳遞

浮點(diǎn)參數(shù)的傳遞與整型類似,區(qū)別在于參數(shù)大小。

x86處理器浮點(diǎn)類型占8個(gè)字節(jié),因此在棧中也需要占8個(gè)字節(jié)。

下表給出浮點(diǎn)參數(shù)在棧中位置關(guān)系:

調(diào)用語(yǔ)句參數(shù)棧幀地址
tail(1.414, 2, 3.998e10);word 0: 1.4148(%ebp)
word 1: 1.41412(%ebp)
216(%ebp)
word 0: 3.998e1020(%ebp)
word 1: 3.998e1024(%ebp)

結(jié)構(gòu)體和聯(lián)合體參數(shù)傳遞

結(jié)構(gòu)體和聯(lián)合體的傳遞與整型、浮點(diǎn)型類似,只是占用大小不同。

x86處理器棧寬是4字節(jié),故結(jié)構(gòu)體在棧上大小是4的倍數(shù)。

編譯器會(huì)對(duì)結(jié)構(gòu)體進(jìn)行適當(dāng)?shù)奶畛涫沟?strong>結(jié)構(gòu)體4字節(jié)對(duì)齊。

對(duì)于其它處理器,參數(shù)傳遞并不全部通過(guò)棧進(jìn)行。結(jié)構(gòu)體可能通過(guò)指針傳遞。

x86函數(shù)返回值傳遞方法

函數(shù)返回值可通過(guò)寄存器傳遞:

  1. 若返回值不超過(guò)4字節(jié)(int、指針),通常保存在EAX中。
  2. 若返回值大于4字節(jié)但不超過(guò)8字節(jié)(long long),通常保存在EAX+EDX,EDX保存高4字節(jié),EAX保存低4字節(jié)。
  3. 若返回值為浮點(diǎn)類型(float double),則通過(guò)專用的協(xié)處理器浮點(diǎn)數(shù)寄存器棧的棧頂返回。
  4. 若返回值為結(jié)構(gòu)體或聯(lián)合體,主調(diào)函數(shù)額外傳遞一個(gè)參數(shù),該參數(shù)是一個(gè)保存返回值的空間地址。

注意:函數(shù)如何保存結(jié)構(gòu)體或聯(lián)合體返回值取決于具體實(shí)現(xiàn)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言單鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    C語(yǔ)言單鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言單鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    簡(jiǎn)單的說(shuō)const關(guān)鍵字修飾的變量具有常屬性,也就是說(shuō)它所修飾的變量不能被修改,下文給大家介紹C/C++中const關(guān)鍵字的用法及其與宏常量的比較,需要的朋友可以參考下
    2017-07-07
  • C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例

    C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例

    這篇文章主要介紹了C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例,詳細(xì)講述了注入DLL到指定的地址空間以及從指定的地址空間卸載DLL的方法,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例

    C語(yǔ)言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出

    Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出

    QT中涉及到數(shù)據(jù)庫(kù)相關(guān)的項(xiàng)目,幾乎都需要將少量的信息數(shù)據(jù)導(dǎo)出到文件保存好,然后用戶可以打開(kāi)該表格進(jìn)行編輯,編輯完成后保存,再重新導(dǎo)入到軟件中。所以本文將具體為大家介紹一下這一功能如何實(shí)現(xiàn),感興趣的可以跟隨小編一起試一試
    2022-01-01
  • 簡(jiǎn)單了解C語(yǔ)言中主線程退出對(duì)子線程的影響

    簡(jiǎn)單了解C語(yǔ)言中主線程退出對(duì)子線程的影響

    這篇文章主要介紹了簡(jiǎn)單了解C語(yǔ)言中主線程退出對(duì)子線程的影響,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 將?C++?類型屬性暴露給?QML

    將?C++?類型屬性暴露給?QML

    這篇文章主要介紹了將?C++?類型屬性暴露給?QML,?QML?是一種基于?JavaScript?的聲明式語(yǔ)言。在?Qt5中,QML有了長(zhǎng)足進(jìn)步,并且同?C++?并列成為?Qt?的首選編程語(yǔ)言下面一起進(jìn)入文章學(xué)習(xí)?QML的條件下也看看如何將將?C++?類型屬性暴露給?QML,需要的朋友可以參考一下
    2021-12-12
  • C++ 之explicit關(guān)鍵字

    C++ 之explicit關(guān)鍵字

    今天我們來(lái)談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細(xì)介紹了C語(yǔ)言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細(xì)的代碼實(shí)例,感興趣的同學(xué)可以借鑒參考
    2023-04-04
  • C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)

    C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)

    這篇文章主要介紹了C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題,涉及C語(yǔ)言堆棧的使用與深度優(yōu)先算法解決迷宮問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)

    c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)

    本文通過(guò)代碼給大家介紹c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù),通過(guò)實(shí)例代碼給大家講解的很詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)c語(yǔ)言兩個(gè)值互換函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-05-05

最新評(píng)論

柳江县| 樟树市| 城口县| 永康市| 威信县| 磐安县| 太仆寺旗| 石景山区| 志丹县| 松桃| 沈阳市| 固安县| 呼图壁县| 萍乡市| 积石山| 斗六市| 大渡口区| 大埔县| 当涂县| 毕节市| 象山县| 肃北| 渑池县| 锦屏县| 顺平县| 三穗县| 泰安市| 怀化市| 延川县| 嵊泗县| 全椒县| 宁阳县| 怀来县| 万山特区| 高安市| 彭阳县| 伊金霍洛旗| 和林格尔县| 镶黄旗| 黄梅县| 房山区|