C ++ Macro определить и отменить определение - PullRequest
0 голосов
/ 15 октября 2018

Я хочу использовать макросы для быстрого создания встроенных функций в заголовках, эти функции относятся к базовому классу, который я подклассифицирую.Я помещу определения в базовый заголовок calss, но я не хочу загрязнять все, что включает эти заголовки, всеми определениями макросов, поэтому я хотел бы написать что-то вроде этого (что, к сожалению, не работает):

#define BEGIN_MACROS \
#define MACRO_1(...) ...\
#define MACRO_2(...) ...\
#define MACRO_3(...) ...

#define END_MACROS \
#undef MACRO_1\
#undef MACRO_2\
#undef MACRO_3

И затем используйте это как:

BEGIN_MACROS
    MACRO_1(...)
    MACRO_2(...)
    MACRO_3(...)
END_MACROS

возможно, я должен использовать что-то подобное?

#include "definemacros.h"
    MACRO_1(...)
    MACRO_2(...)
    MACRO_3(...)
#include "undefmacros.h"

И поместить определения и "неопределенные определения" в два отдельных заголовка ...

Или есть лучший подход к преодолению проблем такого рода?Или вы предлагаете вообще избегать использования макросов и / или макросов в заголовках?

Отредактировано для включения конкретного варианта использования:

определение:

#define GET_SET_FIELD_VALUE_INT(camelcased, underscored)\
inline int rget ## camelcased () { return this->getFieldValue( #underscored ).toInt(); }\
inline void rset ## camelcased (int value) { this->setFieldValue( #underscored , value); }

use:

class PaymentRecord : public RecObj
{
public:
    GET_SET_FIELD_VALUE_INT(PriceIndex, price_index)
//produces this
    inline int rgetPriceIndex() { return this->getFieldValue("price_index").toInt(); }
    inline void rsetPriceIndex(int value) { this->setFieldValue("price_index", value); }

};

1 Ответ

0 голосов
/ 15 октября 2018

вы не можете сложить больше определений в одну строку (по крайней мере, насколько мне известно ... Я бы попытался заключить их в 2 отдельных файла, например:

file macro_beg.h:

#define MACRO_1(...) ...
#define MACRO_2(...) ...
#define MACRO_3(...) ...

file macro_end.h:

#undef MACRO_1
#undef MACRO_2
#undef MACRO_3

Это похоже на ваш второй случай, но использование отличается, поэтому внутри васкод делает это:

#include "macro_beg.h"
void some_your_function1()
 {
 MACRO_1(...);
 }
void some_your_function2()
 {
 MACRO_2(...);
 }
void some_your_function3()
 {
 MACRO_3(...);
 }
#include "macro_end.h"

... вы не можете включать в функцию, поэтому вам нужно инкапсулировать все функции, используя ваши макросы, с помощью включений.

Но как Некоторыепрограммист чувак прокомментировал, что это может не работать должным образом или вообще не зависеть от препроцессора компилятора и сложности макроса или вложенности с кодом класса / шаблона. Однако для простых вещей это должно работать.

...