首先-抱歉我的英语不好:-( 第二 - 我有一些有趣的任务。 前言。 程序将在 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]:宏调用中的参数太少”。你能给我什么建议?
最佳答案
如果一个函数实际上是内联的,它不能比做同样事情的宏慢 - 它们导致相同的汇编。与您发布的代码一样微不足道的功能几乎可以保证内联。您应该放弃宏,而是调查为什么编译器没有为您进行内联 - 也许您没有传递正确的编译标志?
如果你真的,真的想要/必须坚持使用这个宏,你可以使用 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);
}
关于c++ - 在 C++ 中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589560/