2014-01-10 143 views
-1
#define CONCAT(a,b) a##b 
#define METHOD(method) \ 
public: \ 
static int CONCAT(method,wrapper)(int* ptri, char* ptrc, double* ptrd) \ 
{ \ 
    return ((type *)ptri)->method(ptrc,ptrd); \ 
} 

问题1:这个方法有点像类或结构吗?这个宏函数是什么意思?

问题2:对于

static int CONCAT(method,wrapper)(int* ptri, char* ptrc, double* ptrd) 

意思:

static int methodwrapper(int* ptri, char* ptrc, double* ptrd) 
+0

对于计算机来说,它意味着它扩展到什么。你应该问问写它的人的语义是什么意思;我们甚至无法开始猜测。 (除非我在几乎每一行看到至少一个加载的脚枪) – zwol

+0

这意味着你可能有一些代码要重写,方便宏在开发过程中可能看起来不错,但它们是维护噩梦,尝试在调试器中逐步完成 –

回答

3

这一点也不像,它只是混淆代码的方式(或者一遍又一遍地写几乎同样的事情以惰性方式)

以下

class X 
{ 

    public: 
    static int SomeMethodwrapper(int * ptri, char* ptrc, double* ptrd)  
    {  
     return ((type *)ptri)->SomeMethod(ptrc,ptrd);  
    } 
    public:  
    static int SomeOtherMethodwrapper(int * ptri, char* ptrc, double* ptrd)  
    {  
     return ((type *)ptri)->SomeOtherMethod(ptrc,ptrd);  
    } 

}; 

因此可写为

class X 
{ 
    METHOD(SomeMethod) 
    METHOD(SomeOtherMethod) 
}; 
+0

公平地说,这似乎是将C++类方法暴露给C代码的接口 - 混淆并不重要,而宏可以使其更加健壮。当然,C代码正在将C++对象指针转换为int *的想法有点破坏了健壮性的任何概念...... – Notlikethat

+1

@Notlikethat我看不到这个代码如何将类成员暴露给C. C中的'public'。 –

+0

作为一个方面说明,这正是使用Microsoft的COM宏时发生的情况。 –

0

当它从它简单地连接两个标记的宏的名称如下,例如

CONCAT(class, Method) 

导致

classMethod 

作为宏#define METHOD(方法)然后定义一个静态公共方法并使用宏CONCAT来形成方法的名称。

0

我认为Luchian Grigore有一个完美和准确的答案。但是,如果我有机会,我会重构代码以使其更清晰,更易读。我知道一些编程人员只是为了让事情变得复杂而写信,因为他们认为他们是极客或其他人。看看这篇文章的更多的例子,其相当有用:http://www.codeproject.com/Articles/25541/C-C-macros-programming

我也建议你自己尝试一些例子。这会给你一个深刻的理解。一般来说,学习编程是一种很好的态度。