带有默认参数的宏包装函数调用
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)
但是现在问题是所有未通过对齐方式的呼叫者都被打破了,并且有数百个呼叫者。
是否有某种方法可以通过对准是否通过对齐,并且在任何一种情况下都提供文件/行?
使用variadic宏和 __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)
在这里实时示例。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- C 函数调用包装器包含类成员功能作为模板参数
- 尝试构造包装器测量函数调用时间时出现问题
- 模板化类包装成员函数调用的行为
- 带有默认参数的宏包装函数调用
- 包装函数只有在链接为静态时才从链接库调用
- 从包装器调用导出C++ C 函数时LNK2028错误
- 包装一个使用char**[in/out]的C函数调用,以在cython中返回一个python列表
- 用函数作为模板参数的C++函数调用包装器
- 使用可变包类型扩展的C++函数调用程序包装
- 尝试包装函数返回值时出现"<类名>不提供调用运算符"错误
- 可变模板包装函数调用
- 如何通过Delphi包装器调用c++函数
- 通过模板元编程用try包装任意函数调用.catch块在现代c++中
- 如何在一系列包装器函数调用中正确使用va_list
- C++析构函数调用 boost::p ython 包装的对象