2013-05-31 71 views
3

我想寫一個宏,它將所有東西都轉換成void *甚至成員函數。 下面是代碼:在C++ asm塊作爲宏

#define toVoidStar(xx,yy)\ 
    __asm push ecx; \ 
    __asm mov ecx, yy; \ 
    __asm mov [xx], ecx; \ 
    __asm pop ecx; 

結束它給我「稱之爲」錯誤:錯誤C2017:非法逃逸

,如果我在代碼中使用它,它只是正常工作:

void * myvoid; 

__asm 
{ 
    push ecx; 
    mov ecx, imageMousePressed; 
    mov [myvoid], ecx; 
    pop ecx; 
} 

我知道這不是一個很好的解決方案,但無論如何,任何人都可以幫助它得到它的工作?

+2

你能詳細說明你爲什麼要這樣做嗎? void *(void指針)可能沒有任何彙編器。 –

+0

由於彙編分號而不起作用。也許你應該嘗試將它改寫爲模板函數。 – akalenuk

回答

2

你不能給一個宏定義,如:

#define toVoidStar(xx,yy)\ 
    __asm push ecx; \ 
    __asm mov ecx, yy; \ 
    __asm mov [xx], ecx; \ 
    __asm pop ecx; 

行以來__asm push ecx;後,所有的行會因爲使用的;的註釋。看到我的回答這個question

+0

謝謝。有沒有辦法讓它工作?內聯函數在這種情況下不好,因爲我不知道xx的類型。 – DalekSupreme

+0

你只是想將4個字節移動到'myvoid'中地址指向的位置,對吧? –

+0

是的,但我不能做void * myvoid =&eventHandlerFunct,因爲它是一個成員函數。無論如何,其他答案工會黑客工作正常,但我仍然好奇我的解決方案是否可以以某種方式工作。 – DalekSupreme

8

爲什麼不是標準聯盟破解?

template<class T> 
void* as_void(T const & x) 
{ 
    union hlp_t{ 
     void * v_ptr; 
     T t; 
    }; 
    hlp_t a; 
    a.t = x; 
    return a.v_ptr; 
} 

用法:as_void(&std::vector<int>::size)

+0

非常感謝,它實際上工作。這真太了不起了。 – DalekSupreme

+0

是的,這是正確的C++魔術=) – kassak

+0

呃,你確定應該在工會'T',而不是'T *'? –

2

因爲__asm關鍵字是語句分隔符,你也可以把在同一行彙編指令(see this link):

__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al 

因此,解決辦法是隻省略分號,編譯器會知道語句在哪裏結束。

+0

爲了澄清我自己,你只需在宏中每個「行」的末尾刪除分號? –

+0

@QPaysTaxes正好。 – typ1232