2014-01-10 2 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 - такого рода вещи, где обфускация не имеет большого значения, а макросы _can_ делают ее более надежной. Конечно, идея о том, что C-код делает вещи с указателями объектов C++, отличными от 'int *', несколько подрывает любое понятие надежности ... – Notlikethat

+1

@Notlikethat Я не вижу, как этот код может выставлять класс членам C. нет 'public' в C. –

+0

В качестве побочного примечания это именно то, что происходит, когда вы используете макросы Microsoft COM. –

0

Как следует из названия макроса он просто сцепляет два маркера, например

CONCAT(class, Method) 

приводит к

classMethod 

Что касается макро #define METHOD (method), то он определяет статический общедоступный метод и использует макрос CONCAT для формирования имени метода.

0

Я думаю, что у Лучиана Григоре есть прекрасный и точный ответ. Однако, если бы у меня был шанс, я бы реорганизовал код, чтобы быть более чистым и читаемым. Я знаю некоторых кодеров, которые просто пишут, чтобы сделать вещи сложными, потому что они думают, что они выродки или что-то еще. Взгляните на эту статью для получения дополнительных примеров, ее довольно полезно: http://www.codeproject.com/Articles/25541/C-C-macros-programming

Я также предлагаю вам попробовать несколько примеров самостоятельно. Это даст вам глубокое понимание. Это отличное отношение к изучению программирования в целом.

Смежные вопросы