[英]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.