0

首先 - 对不起我的英语不好:-( 其次 - 我有一些有趣的任务。前言。程序将在 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]:宏调用中的参数太少”。你能给我什么建议?

4

1 回答 1

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);
}

活生生的例子

于 2013-10-25T12:51:24.380 回答