我想编写一个宏,将所有内容转换为void *甚至是成员函数。 这是代码:
#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;
}
我知道这不是一个非常好的解决方案,但无论如何,任何人都可以帮助它起作用吗?
答案 0 :(得分: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)
答案 1 :(得分:2)
您不能给出如下的宏定义:
#define toVoidStar(xx,yy)\
__asm push ecx; \
__asm mov ecx, yy; \
__asm mov [xx], ecx; \
__asm pop ecx;
由于使用了__asm push ecx;
,因此;
行之后的所有行都会被注释掉。请参阅我的答案question。
答案 2 :(得分:2)
因为__asm关键字是一个语句分隔符,所以您也可以将汇编指令放在同一行(see this link)上:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
所以解决方法就是省略分号,编译器会知道语句的结束位置。