c++ - 在 C++ 中使用宏

标签 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]:宏调用中的参数太少”。你能给我什么建议?

最佳答案

如果一个函数实际上是内联的,它不能比做同样事情的宏慢 - 它们导致相同的汇编。与您发布的代码一样微不足道的功能几乎可以保证内联。您应该放弃宏,而是调查为什么编译器没有为您进行内联 - 也许您没有传递正确的编译标志?

如果你真的,真的想要/必须坚持使用这个宏,你可以使用 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

关于c++ - 在 C++ 中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589560/

相关文章:

c++ - 将旧 cstring 的标记连接到新的 c 字符串

c++ - 如何用QPainter绘制单色椭圆(无黑边)

java - 构建 NDK 共享库时导出 header

C++ 子字符串为什么要这样做?

c++ - 错误 C2544 : expected ')' for operator '()'

C++ Boost 将 UNIX 时间戳转换为 MySQL 兼容的 DATETIME 字符串

c - 为什么 avr-gcc 在扩展我的 [fancy] 宏时告诉我缺少参数?

c++ - C/C++ 很酷的宏定义?

macros - Clojure 的宏——定义一个名称由参数组成的绑定(bind)

c - 跟踪静态内联函数