3

我想编写一个宏,将所有内容都转换为 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;
}

我知道这不是一个很好的解决方案,但无论如何有人可以帮助它工作吗?

4

3 回答 3

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)

于 2013-05-31T09:51:56.133 回答
2

您不能给出如下宏定义:

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

因为该行之后的所有行都__asm push ecx;将因为使用而被注释掉;。请参阅我对这个问题的回答。

于 2013-05-31T09:44:14.263 回答
2

因为 __asm 关键字是语句分隔符,所以您也可以将汇编指令放在同一行(请参阅此链接):

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

所以解决方案是省略分号,编译器会知道语句在哪里结束。

于 2013-10-18T14:47:56.680 回答