【问题标题】:Rewrite macro as c++ function?将宏重写为 C++ 函数?
【发布时间】:2015-12-11 20:04:58
【问题描述】:

我想将此宏重写为 c++ 函数。

#define SAFE_BUFFER_DELETE(buf)     { if(buf != NULL) { buffer_delete(buf); buf = NULL; } }

其他信息http://paste.ubuntu.com/13940691/ abot .头文件

    void buffer_read(LPBUFFER buffer, void * buf, int bytes) {
        thecore_memcpy(buf, buffer->read_point, bytes);
        buffer_read_proceed(buffer, bytes);
    }

void buffer_delete(LPBUFFER buffer) {
    if (buffer == NULL) {
        return;
    }
    buffer_reset(buffer);

    int size = buffer->mem_size;

    int pool_index = buffer_get_exac_pool_index(size);
    if (pool_index >= 0) {
        BUFFER** buffer_pool = normalized_buffer_pool + pool_index;
        buffer->next = *buffer_pool;
        *buffer_pool = buffer;
    } else {
        free(buffer->mem_data);
        free(buffer);
    }
}

【问题讨论】:

  • 什么阻止了这样做?
  • buf 可以接受哪些类型?
  • 真正的问题是什么?
  • 顺便说一句,没有必要检查NULLdelete 使用空指针是无操作的(假设这是您在 buffer_delete 函数中所做的)。
  • SAFE_BUFFER_DELETE - 一厢情愿。

标签: c++ macros


【解决方案1】:

通过查看buffer_delete 的源代码,很明显对if (buf != NULL) 的检查完全是多余的。所以摆脱它。

完成后,宏会做两件事。

  • 在其参数上调用buffer_delete
  • NULL 分配给它的参数

如何在函数中做第一件事是很清楚的。在 C++ 中,函数也可以接受参数作为引用,因此可以修改它。你的函数应该是这样的。

inline void
safe_delete_buffer(LPBUFFER& buf)
{
  buffer_delete(buf);
  buf = nullptr;
}

我假设LPBUFFER 是某个指针类型的typedef

这种功能的行为对用户是否有用和直观是另一个问题。

【讨论】:

  • typedef 结构缓冲区* LPBUFFER;是的,这是一个typedef
猜你喜欢
  • 2016-01-21
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多