2010-06-03 3 views
3

Является ли это переопределением макросов для класса или что именно это происходит?Определение макроса на C++ неясно

#define EXCEPTIONCLASS_IMPLEMENTATION(name, base, string) : public base  \ 
    {                \ 
public:                 \ 
    name() : base(string) {}           \ 
    name(const x::wrap_exc& next) : base(string,next) {};    \ 
    name(const x::wrap_exc& prev, const x::wrap_exc& next) :   \ 
     base(prev, next) {};           \ 
} 
+0

Это немного странно. Я ожидаю увидеть ключевое слово 'class' в начале этого макроса. Как и сейчас, нужно написать 'class EXCEPTIONCLASS_IMPLEMENTATION (DivByZeroException, MathException," ");'. – Novelocrat

ответ

9

: определение макроса для класса исключения.

Похоже кто-то хочет писать код так:

class my_exception EXCEPTIONCLASS_IMPLEMENTATION(my_exception, std::exception, "What a mess!") 

Предварительно процессор выплюнет:

class my_exception : public std::exception { public: my_exception() : std::exception("What a mess!") {} my_exception(const x::wrap_exc& next) : std::exception("What a mess!",next) {}; my_exception(const x::wrap_exc& prev, const x::wrap_exc& next) : std::exception(prev, next) {}; } 

Что именно это?

Это мерзость!

+1

Помимо того, что он требует, чтобы вы набирали заголовок класса раньше макрос, я не думаю, что это мерзость. Все, что экономит печатание, полезно, ИМО. –

+0

Я поражен тем, что человек, создавший этот макрос, не завершил определение класса, включив «имя класса». Это в стороне, что-то, что неясно опытному программисту, не полезно, так как это делает обслуживание кошмаром. – Johnsyweb

3

это макрос для исключения, который создает исключение со стандартными конструкторами.

+0

так что это имя() конструктор какого-то класса или это параметр ??? –

+0

@ Тони это конструктор этого класса. когда вы пишете в коде 'EXCEPTIONCLASS_IMPLEMENTATION (DivByZeroException, MathException," ")' он будет расширяться до ... DivByZeroException(): MathException ("") {} – Andrey

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