在C ++中使用宏

时间:2013-10-25 12:12:23

标签: c++ macros

首先 - 抱歉我的英语不好:-( 第二 - 我有一些有趣的任务。 前言。 程序将在ATMega162上运行。我们使用宏,因为函数工作非常慢。即使是内联...... 任务。 我有一个宏:

#define ProvSetBit(reg, bit) (((reg) & (1<<(bit))) != 0)

并检查位转入非常长的,不可读的字符串:

ProvSetBit(SystemStatus[0], COMMAND_ON_DF);

#define COMMAND_ON_DF 0u

我想修改它:

ProvSetBit(COMMAND_ON_DF);

其中COMMAND_ON_DF:

#define COMMAND_ON_DF (SystemStatus[0], 0u)

或那里的东西。但它不起作用。调试器写:“错误[Pe054]:宏调用中的参数太少”。你可以给我什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果函数实际内联,不能比执行相同操作的宏慢 - 它们会导致相同的程序集。而且,与您发布的代码一样简单的功能几乎可以保证内联。你应该放弃宏,而是调查为什么编译器没有为你做内联 - 你没有传递正确的编译标志?

如果你重新开始,真的希望/必须坚持使用这个宏,你可以使用Boost.Preprocessor来实现这个目标:

#include "boost/preprocessor/facilities/expand.hpp"

#define ProvSetBit(args) BOOST_PP_EXPAND(ProvSetBit_1 args)

#define ProvSetBit_1(reg, bit) (((reg) & (1<<(bit))) != 0)

#define COMMAND_ON_DF (SystemStatus[0], 0u)

int main()
{
  ProvSetBit(COMMAND_ON_DF);
}

Live example