c++ - C++ 宏定义和取消定义
问题描述
我想使用宏在标题中快速创建内联函数,这些函数与我正在继承的基类相关。我将把定义放在基本 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); }
};
解决方案
您不能将更多定义堆叠到单行中(至少据我所知......我会尝试将它们封装到 2 个单独的文件中,而不是像这样:
文件宏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"
...您不能在函数中包含包含,因此您需要使用包含的宏来封装所有函数。
但是正如 一些程序员花花公子评论的那样,这可能无法正常工作或根本无法正常工作,具体取决于编译器预处理器和宏复杂性或与类/模板代码的嵌套。但是,对于简单的东西,这应该可以。
推荐阅读
- python - Python 3.x 中的 Rigged RNG 名称选择器
- java - 如何配置弹簧安全性
- python - 我可以将数据框导出到 Excel 作为第一张工作表吗?
- c# - 序列化/反序列化可枚举实例时,protobuf-net 使用什么迭代方法?
- java - 通过引用在 C 结构中的 JNA 多个 void 指针
- clickhouse - 为日志引擎启用 system.columns
- solr - Datastax Search / Solr中的分组和计数(*)
- datetime - Flutter - 无法格式化日期时间
- django - 如何编写自定义权限类以在 api 级权限之前检查对象级权限?
- java - 如何计算霍夫曼码的位数?