繁体   English   中英

具有默认参数的宏包装函数调用

[英]macro wrapping function call with default arguments

我有一个分配内存的函数,它有一个默认的对齐参数。

void* symalloc(int numbytes, int alignment=32)

我想从呼叫位置传递文件/行号。 所以,我将其更改为...

void* _symalloc(int numbytes, int alignment, const char* file, int line);
#define symalloc(numbytes, alignment) _symalloc(numbytes, alignment, __FILE__, __LINE)

但是现在的问题是,所有未按顺序传递的呼叫者都被打断了,其中有数百个。

是否可以通过某种方式使此支持或不通过对齐,并在两种情况下都提供文件/行?

使用可变参数宏和__VA_ARGS__ (C ++ 11及更高版本,并且通常也受早期编译器支持):

void symalloc_(const char* file, int line, int numbytes, int alignment=32);
#define symalloc(...) (symalloc(__FILE__, __LINE__, __VA_ARGS__))

请注意参数的重新排列,以便默认参数位于最后一个参数上。

您还需要为其他值设置默认参数,因此某些呼叫站点没有默认值并不重要:

void* _symalloc(int numbytes, int alignment = 32, const char* file = NULL, int line = 0);

可能有一些预处理器魔术(由于此答案

真正的技巧是解决宏不能重载这一事实。 这些宏通过使用参数本身来在按位置选择的另一个宏(用于选择重载)的名称周围移动来工作。

请注意,默认值“ 32”出现在SYMALLOC1宏内。

#include <iostream>

void* symalloc_impl(int numbytes, int alignment, const char* file, int line){
    std::cout << file << ':' << line << "> symalloc(" << numbytes << ", " << alignment << ")\n";
    return nullptr;
}

#define SYMALLOC1(numbytes) symalloc_impl(numbytes, 32, __FILE__, __LINE__)
#define SYMALLOC2(numbytes, alignment) symalloc_impl(numbytes, alignment, __FILE__, __LINE__)
#define SYMALLOC_DISPATCH(_1,_2,NAME,...) NAME
#define symalloc(...) SYMALLOC_DISPATCH(__VA_ARGS__,SYMALLOC2,SYMALLOC1,UNUSED)(__VA_ARGS__)

int main() {

    symalloc(16);

    symalloc(64, 8);

    return 0;
}

输出示例:

main.cpp:15> symalloc(16, 32)

main.cpp:17> symalloc(64, 8)

这里的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM