【发布时间】:2018-10-15 06:58:00
【问题描述】:
我想使用宏在标题中快速创建内联函数,这些函数与我正在继承的基类相关。我会将定义放在基本 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); }
使用:
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); }
};
【问题讨论】:
-
这里最好避免使用宏。但仍然向我们展示用例。你可以edit你的问题。
-
第一种方法的第一个问题是行继续反斜杠创建了 single 行,并且预处理器语句是基于行的。第二个问题是预处理器是单程的,由宏创建的宏定义不会被解析和处理。
-
如此广泛地使用宏通常是设计错误。请重新考虑或详细说明您的用例。
-
一般来说,您不能使用宏来创建预处理器指令。预处理器并不是那么聪明。您可以做的最好的事情是选择性地包含带有
#ifdef...#endif的预先编写的指令。
标签: c++ c-preprocessor header-files preprocessor-directive