C++ 宏定义和取消定义

Posted

技术标签:

【中文标题】C++ 宏定义和取消定义【英文标题】:C++ Macro define and undefine 【发布时间】: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 的预先编写的指令。 【参考方案1】:

您不能将更多定义堆叠到单行中(至少据我所知......我会尝试将它们封装到 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"

...您不能在函数内包含包含,因此您需要使用包含的宏来封装所有函数。

但正如一些程序员花花公子评论的那样,这可能无法正常工作或根本无法正常工作,具体取决于编译器预处理器和宏复杂性或与类/模板代码的嵌套。但是,对于简单的东西,这应该可以。

【讨论】:

以上是关于C++ 宏定义和取消定义的主要内容,如果未能解决你的问题,请参考以下文章

C++基础学习(04)——常量

取消宏定义

C++中怎样写宏定义

#undef取消宏定义

[c++] 用宏定义一个函数

C++ 中define(宏定义) 各种用法(含特殊),小举个例子,谢谢!