首先 - 抱歉我的英语不好:-( 第二 - 我有一些有趣的任务。 前言。 程序将在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]:宏调用中的参数太少”。你可以给我什么建议吗?
答案 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);
}