VC的函數修飾名

VC 中的修飾名(Decoration name)

“C”或者“C++”函數在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字 符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數、構造函數、析構函數,又如在匯編代碼里調用“C””或“C ++”函數等。

修飾名由函數名、類名、調用約定、返回類型、參數等共同決定。

    1. 調用約定

調用約定(Calling convention)決定以下內容:函數參數的壓棧順序,由調用者還是被調用者把參數彈出棧,以及產生函數修飾名的方法。MFC支持以下調用約定:

  1. _cdecl

    按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于“C”函數或者變量,修飾名是在函數名前加下劃線。對于“C++”函數,有所不同。

    如函數void test(void)的修飾名是_test;對于不屬于一個類的“C++”全局函數,修飾名是?test@@ZAXXZ。

    這是MFC缺省調用約定。由于是調用者負責把參數彈出棧,所以可以給函數定義個數不定的參數,如printf函數。

  2. _stdcall

    按從右至左的順序壓參數入棧,由被調用者把參數彈出棧。對于“C”函數或者變量,修飾名以下劃線為前綴,然后是函數名,然后是符號“@”及參數的字節數,如函數int func(int a, double b)的修飾名是_func@12。對于“C++”函數,則有所不同。

    所有的Win32 API函數都遵循該約定。

  3. _fastcall

    頭兩個DWORD類型或者占更少字節的參數被放入ECX和EDX寄存器,其他剩下的參數按從右到左的順序壓入棧。由被調用者把參數彈出棧,對于“C”函數或者變量,修飾名以“@”為前綴,然后是函數名,接著是符號“@”及參數的字節數,如函數int func(int a, double b)的修飾名是@func@12。對于“C++”函數,有所不同。

    未來的編譯器可能使用不同的寄存器來存放參數。

  4. thiscall

    僅僅應用于“C++”成員函數。this指針存放于CX寄存器,參數從右到左壓棧。thiscall不是關鍵詞,因此不能被程序員指定。

  5. naked call

    采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked call不產生這樣的代碼。

    naked call不是類型修飾符,故必須和_declspec共同使用,如下:

    __declspec( naked ) int func( formal_parameters )

    {

    // Function body

    }

  6. 過時的調用約定

原來的一些調用約定可以不再使用。它們被定義成調用約定_stdcall或者_cdecl。例如:

#define CALLBACK __stdcall

#define WINAPI __stdcall

#define WINAPIV __cdecl

#define APIENTRY WINAPI

#define APIPRIVATE __stdcall

#define PASCAL __stdcall


表7-1顯示了一個函數在幾種調用約定下的修飾名(表中的“C++”函數指的是“C++”全局函數,不是成員函數),函數原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。

表7-1 不同調用約定下的修飾名

調用約定

extern “C”或.C文件

.cpp, .cxx或/TP編譯開關

_cdecl

_test

?test@@ZAXXZ

_fastcall

@test@0

?test@@YIXXZ

_stdcall

_test@0

?test@@YGXXZ


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

You can‘t specify target table ‘XXX‘ for update in FROM clause

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題,意思大致是:在一條 sql 語句中不能先查出來部分內容,再同時又對當前表作修改。 解決方法&…

牛客網——最簡真分數

題目描述 給出n個正整數&#xff0c;任取兩個數分別作為分子和分母組成最簡真分數&#xff0c;編程求共有幾個這樣的組合。輸入描述: 每組包含n&#xff08;n<600&#xff09;和n個不同的整數&#xff0c;整數大于1且小于等于1000。 輸出描述: 每行輸出最簡真分數組合的個數…

csvn(apache+svn)管理工具搭建

系統環境&#xff1a;centos7.4一、服務端下載這個文件并解壓&#xff08;如果打不開&#xff0c;請下方留言&#xff09;https://pan.baidu.com/s/1miwdBc81、安裝jdk,上傳到服務器上&#xff0c;解壓[rootslave2 opt]# tar -zxvf jdk-8u91-linux-x64.gz[rootslave2 opt]# vim…

java中程序執行順序

①在java中執行順序 一 靜態初始化塊 二 非靜態初始化塊 三 構造器 四 父類構造器 ② java中的賦值順序 一 靜態初始化塊直接賦值 二 非靜態初始化塊直接賦值 三 父類繼承的屬性已賦值 四 靜態變量聲明時賦值 五 成員變量聲明時賦值 六 構造器賦值 接下來我們用一個…

編程復雜性等級劃分

摘要&#xff1a;相信開發人員一定對初級、中級、高級軟件工程師這類詞匯很熟悉吧&#xff01;你們是否對編程進行過等級劃分&#xff1f;這個又是如何劃分的呢&#xff1f;本文作者把編程復雜性從簡到難化成27個等級&#xff0c;你同意這樣的劃分嗎&#xff1f;通常來說&#…

對于抽象類的理解

這是我個人對抽象類的理解&#xff0c;為什么要有抽象類&#xff0c;因為我們在寫某個類時&#xff0c;只能寫出大概的一些屬性和共性行為&#xff0c;并不能一下子寫下所體現的具體細節&#xff0c;如我們學到的一個例子&#xff0c;我們人用打印機&#xff0c;可我們只知道打…

Spring中基于Java的配置@Configuration和@Bean用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Spring中為了減少xml中配置&#xff0c;可以聲明一個配置類&#xff08;例如SpringConfig&#xff09;來對bean進行配置。 一、首先&am…

【實數二分/前綴和維護】Best Cow Fences

Poj 2018 Best Cow Fences 實數二分前綴和維護 調了一晚上&#xff0c; 但發現沒什么注意事項orz 無輸出只因eps定義成了int型QAQ哭唧唧 #include<cstdio> #include<iostream> using namespace std; const int sz 100010; double eps 1e-5; int n, f; double a[s…

json回顯

第一種&#xff1a;用json的oData塞值 案例顯示&#xff1a; list頁面url帶值 //活動基本信息修改 function updateProject() {   var selectRow $$.getSingleSelectRow(listId, "請選擇你要操作的項目進行修改&#xff01;");   if(selectRow.activity_status&…

NoSuchElementException

在之前下項目的時候遇到這個.NoSuchElementException異常,當時我寫到一個大類的結尾。但是編譯器。從未報錯。然而在運行的時候出現了這樣的異常&#xff0c;非常頭疼 &#xff0c;一到運行時候就報異常&#xff0c;我就上網搜索了一下&#xff0c;才明白&#xff0c;這是我的剛…

東方程序員怎么看西方程序員

摘要&#xff1a;東方程序員與西方程序員&#xff0c;彼此心中是什么樣子呢&#xff1f;本文收集了東西方程序員對彼此的看法與各種印象&#xff0c;對于西方/東方程序員&#xff0c;你留有什么印象呢&#xff1f; 本文是作者根據StackExchange上的一個討論貼&#xff1a;東方程…

Android開發 - 掌握ConstraintLayout(一)傳統布局的問題

在傳統的Android開發中&#xff0c;頁面布局占用了我們很多的開發時間&#xff0c;而且面對復雜頁面的時候&#xff0c;傳統的一些布局會顯得非常復雜&#xff0c;每種布局都有特定的應用場景&#xff0c;我們通常需要各種布局結合起來使用來實現復雜的頁面。隨著ConstraintLay…

輸入流與輸出流的區別

stream結尾都是字節流&#xff0c;reader和writer結尾都是字符流兩者的區別就是讀寫的時候一個是按字節讀寫&#xff0c;一個是按字符。實際使用通常差不多。在讀寫文件需要對內容按行處理&#xff0c;比如比較特定字符&#xff0c;處理某一行數據的時候一般會選擇字符流。只是…

【Spring】Spring高級話題-@Enable***注解的工作原理

EnableAspectJAutoProxy 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 EnableAspectJAutoProxy注解 激活Aspect自動代理 <aop:aspectj-autoproxy/> 1 開啟對AspectJ自動代理的支…

IDEA項目找不到瀏覽器報錯的情況

調tomcat的時候&#xff0c;它會調用瀏覽器&#xff0c;瀏覽器關聯如果有問題&#xff0c;肯定是會報錯的 要是測試的時候&#xff0c;就是瀏覽器的問題&#xff0c;重新把瀏覽器裝一遍讓他自己重新關聯一下應該就行了轉載于:https://www.cnblogs.com/Koma-vv/p/10156478.html

c/c++經典面試試題及標準答案

下面的問題我想大部分c/c 程序員 都遇見過.如果沒有看過&#xff0c;草根IT特別推薦一下。 一、請填寫BOOL , float, 指針變量與“零值”比較的 if 語句。&#xff08;10分&#xff09;請寫出 BOOL flag 與“零值”比較的 if 語句。&#xff08;3分&#xff09;標準答案&#x…

微服務拆分

微服務拆分是做微服務架構很重要也很難的話題&#xff0c;很多時候&#xff0c;幾個服務是合還是拆在設計團隊內也很難達成共識。 當你糾結應該拆分和合并時我建議就先合并&#xff0c;等后面版本迭代需要時有必要再去做拆分。從系統發展的角度說&#xff0c;很多平臺也都是從單…

oracle數據庫學習筆記

字符函數是ORACLE中最常用的函數: Lower(char):將字符串轉化為小寫格式 Upper(char):將字符轉化為大寫的格式 Length(char):返回字符串的長度 Substr(char,m,n):取字符串的子串 Trim,Ltrim,Rtrim:去掉空格 dual 虛表 當沒有表可以用的時候 就用虛表 as 當做 可以理解為別…

并發編程-concurrent指南-線程池ExecutorService的使用

有幾種不同的方式來將任務委托給 ExecutorService 去執行&#xff1a; execute(Runnable)submit(Runnable)submit(Callable)invokeAny(…)invokeAll(…)execute(Runnable) execute(Runnable) 方法要求一個 java.lang.Runnable 對象&#xff0c;然后對它進行異步執行。以下是使用…

怎樣去理解@ComponentScan注解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 怎么樣去理解它呢&#xff1f; 1.配置視圖控制器 [java] view plain copy package com.apress.prospringmvc.bookstore.web.config; imp…