我想使用宏在标头中快速创建内联函数,这些函数与我子类化的基类相关。我将这些定义放入基本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"
然后将定义和“ undefinitions”放在两个单独的标题中...
还是有一种更好的方法来克服此类问题? 还是建议您完全避免在标头中使用宏和/或宏?
经过编辑以包含特定的用例:
定义:
#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); }
};
答案 0 :(得分:0)
您不能将更多的定义堆叠到一行中(至少据我所知...我将尝试将这些定义封装到2个单独的文件中,而不是这样:
文件macro_beg.h:
#define MACRO_1(...) ...
#define MACRO_2(...) ...
#define MACRO_3(...) ...
文件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"
...函数中不能包含include,因此需要使用包含include的宏来封装所有函数。
但是,正如一些程序员花花公子所评论的那样,这可能无法正常工作或根本无法工作,这取决于编译器的预处理器和宏的复杂性或与类/模板代码的嵌套。对于简单的东西,这应该可以工作。