關於“在內聯彙編中不能呼叫類的成員函式“的誤解
例如,以下程式在VC2003中可通過編譯並正確執行:(但是在VC6中是不能通過編譯的)
#include<iostream>
using namespace std;
class CTest
{
public:
void Output(int i)
{
cout<< i <<endl;
}
};
int main(void)
{
CTest te;
__asm
{
lea ecx, [te];
push 100;
call CTest::Output;
}
}
有兩個說明,在此再囉嗦一下:
- this指標放到ecx暫存器裡
- 不需要手動清除棧
相關推薦
C++ Hook(鉤子)程式設計,通過內聯彙編,使類成員函式代替全域性函式(靜態函式)
程式語言:C/C++ 編譯環境:Visual Studio 2008 核心方法::通過內聯彙編,構造類物件獨享的函式(委託),完成了類成員函式到普通全域性函式的轉化,並在Windows Hook(鉤子)程式設計中得到成功的實踐。 關鍵字:C++,委託,內聯彙編,Hook,成
MFC中非類成員函式呼叫類成員函式方法
1、定義對話方塊類物件全域性變數指標 CDialog *g_pDlg,同時在初始化對話方塊時用this指標初始化此全域性變數。 2、在非類成員函式中可以使用g_pDlg->成員函式名或變數名進行呼叫訪問。 假如有類A,類B兩個類。如果想在B中呼叫A的成員函式,該怎麼辦
在類中使用類成員函式建立執行緒
demo書寫大概步驟: 1》建立一個類,在類中建立一個函式 2》在建構函式中建立執行緒,使用類中的成員函式 類中程式碼: 類頭: #pragma once #include &l
C++指標直接呼叫類成員函式探討
摘要 本文分析了C++程式設計中用指標呼叫“類” 成員函式時出現的問題、原因及後果,討論了一般函式指標和“類”成員函式指標的不同。得出結論: 任何指向“類”的成員函式指標,由於攜帶額外的所屬物件資訊,與一般的函式有根本的不同,不能直接用來進行函式呼叫。此外,本文給出了幾種間接呼叫類的成員函式的方法。作者所
在C++的類中使用類成員函式作為回撥函式
由於類有隱式的this指標,所以不能直接把類成員函式作為回撥函式使用。現用一例子來展示如何在類中使用類成員函式作為回撥函式。 此例子僅用於展示如何在類中使用類成員函式作為回撥函式 程式碼如下: #include "stdafx.h" #include
關於“在內聯彙編中不能呼叫類的成員函式“的誤解
MSDN的"inline assembly"中明確說明:在__asm塊中只能呼叫未過載的全域性C++函式,不能呼叫過載的全域性C++函式或一個類的成員函式。在VC6.0中,的確不能使用內聯彙編呼叫類的成員函式。但是經本人試驗,在VC2003中可
C++中 執行緒函式為靜態函式 及 類成員函式作為回撥函式
執行緒函式為靜態函式: 執行緒控制函式和是不是靜態函式沒關係,靜態函式是在構造中分配的地址空間,只有在析構時才釋放也就是全域性的東西,不管執行緒是否執行,靜態函式的地址是不變的,並不在執行緒堆疊中static只是起了一個裝飾的作用,所以二者並沒有必然的關係 執行緒也是一種
c++中指向物件的指標為NULL時可以呼叫物件成員函式嗎
問題貌似有點奇怪,指標都為NULL了怎麼還可使用?但其實不是的,可以看以下程式碼: #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 void
通用的類成員函式呼叫方法.
這個方法可以實現按照統一的介面來呼叫類成員函式,或者靜態函式和非類成員函式. 主要原理很簡單, 就是儲存類物件指標和函式指標, 需要呼叫的時候就根據類物件指標是否為空來使用不同的方式呼叫函式. 首先, 我們需要一個把成員函式指標轉化成void *的東西..(強制轉換似乎是不行的), 因為我們需要把成員
c++中的函式指標和類成員函式指標
// // main.cpp // Demo // // Created by 杜國超 on 16/12/28. // Copyright © 2016年 杜國超. All rights reserved. // #include using namespace std; class MYCla
在DLL中使用單例模式輸出類成員函式
DLL檔案中存放的是各類程式的函式,在需要用的時候載入DLL,取得相應的函式地址,然後呼叫DLL裡的函式,在編寫DLL的時候,除了編寫全域性函式,類的使用也是很有必要的,而如何匯出成員函式,我個人做了幾個總結。 1、匯出類 class _stdcall _declspe
C++中類成員函式的過載、覆蓋和隱藏的區別,超清楚!
1.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 2.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;
c++ 類成員函式內刪除this指標
問題1:成員函式內能不能delete this。 但從編譯來說, 都是可以的。 但從執行中, 又得分情況來看。 1. 解構函式內呼叫delete this。 這是一定不行的, 解構函式內呼叫delete this 可以理解為 函式無終止條件自我遞迴呼叫, 最終導致棧溢位。
在keil中,彙編中呼叫c函式
今天遇到個問題,以為是彙編中呼叫C函式的原因,其實不是這個原因,在這裡也溫習一下在ARM彙編呼叫C函式的方式。若在彙編中呼叫C檔案中的函式 void fun_c(void),只需要在呼叫之前,IMPORT fun_c ,其中 keil工具是不允許彙編語句頂格寫,不然會報錯。
彙編中呼叫C中的函式,函式名前加下劃線“_”
之前見過這種用法,但是不太清楚為什麼,就以為是約定俗成,其實也算是約定俗成,這樣做的目的是為了防止符號名衝突,因為在一個程式中往往是包含彙編和C檔案的,彙編用於啟動部分,C檔案用於應用程式,最終通過編譯器實現編譯,對於編譯器來說,彙編和C是一視同仁的,那麼就會有個問題,
c語言呼叫c++類成員函式的方法
最近做了一個wav格式的音訊播放器,介面部分用Qt實現,中間層程式碼使用C語言實現,這就涉及到c和c++相互呼叫的問題。 c++呼叫c語言的方法在另一篇文章中已經說明,c呼叫c++的方法現做如下介紹。 音訊播放的時候中間層程式碼需要將音訊的播放進度和狀態等資訊反饋給介面程式
C++類成員函式在.cpp中設定成inline後無法解析的問題
行內函數:告知編譯器在進行有內聯標識的函式呼叫時將函式體部分在呼叫處展開。這樣做可以消除函式傳參(堆疊呼叫)的負擔,提高了函式的呼叫效率。 而且inlining的函式並不存在,因為已經被展開了。 如果需要定義一個行內函數,需要在函式體定義的地方使用inline關鍵字標識,
模板類成員函式的定義和宣告為什麼要放在一個檔案中
“通常情況下,你會在.h檔案中宣告函式和類,而將它們的定義放置在一個單獨的.cpp檔案中。但是在使用模板時,這種習慣性做法將變得不再有用,因為當例項化一個模板時,編譯器必須看到模板確切的定義,而不僅僅是它的宣告。因此,最好的辦法就是將模板的宣告和定義都放置在同一個.h檔案中。這就是為什麼所有的STL標頭檔
類成員函式中過載/重寫(覆蓋)/重定義(隱藏)的區別
先來說說過載的含義,在日常生活中我們經常要清洗一些東西,比如洗車、洗衣服。儘管我們說話的時候並沒有明確地說用洗車的方式來洗車,或者用洗衣服的方式來洗一件衣服,但是誰也不會用洗衣服的方式來洗一輛車,否則等洗完時車早就散架了。我們並不要那麼明確地指出來就心知肚明,這就有過載的意思了。在同一可訪問區內被聲名的幾個具
const 在類成員函式中的使用說明
在類中宣告成員函式的時候, 當不允許成員函式修改到我們的物件的成員變數的時候, 常常會在函式的名的尾部加上const 關鍵字修飾。 這樣, 如果我們無意中在函式內部修改到了資料成員, 或者呼叫了其他的非const 函式的時候, 編譯器會報錯。例如: #include <