Something between __func__ and __PRETTY_FUNCTION__?(__func__ 和 __PRETTY_FUNCTION__ 之间的东西?)
问题描述
我使用 g++ 4.8.1 并使用这两个宏进行调试.但是,__func__
宏只给了我函数名,如果你在不同的类中有许多同名的函数,这可能会产生误导.__PRETTY_FUNCTION__
宏生成整个函数签名 - 带有返回类型、类名和所有参数,可能很长.
I work with g++ 4.8.1 and use these two macros for debugging. However, the __func__
macro gives me only the function name, which might be misleading in the case you have many functions with the same name in different classes. The __PRETTY_FUNCTION__
macro produces the whole function signature - with return type, class name and all arguments, which can be very long.
我想要介于两者之间的东西 - 一个宏,它只会给我类名和函数名.有什么方法可以实现吗?
I'd like to have something between - a macro, which will give me only class name and function name. Any way to achieve that?
推荐答案
灵感来自 这个,我创建了如下宏__COMPACT_PRETTY_FUNCTION__
:
Inspired by this, I created the following macro __COMPACT_PRETTY_FUNCTION__
:
std::string computeMethodName(const std::string& function, const std::string& prettyFunction);
#define __COMPACT_PRETTY_FUNCTION__ computeMethodName(__FUNCTION__,__PRETTY_FUNCTION__).c_str() //c_str() is optional
std::string computeMethodName(const std::string& function, const std::string& prettyFunction) {
size_t locFunName = prettyFunction.find(function); //If the input is a constructor, it gets the beginning of the class name, not of the method. That's why later on we have to search for the first parenthesys
size_t begin = prettyFunction.rfind(" ",locFunName) + 1;
size_t end = prettyFunction.find("(",locFunName + function.length()); //Adding function.length() make this faster and also allows to handle operator parenthesys!
if (prettyFunction[end + 1] == ')')
return (prettyFunction.substr(begin,end - begin) + "()");
else
return (prettyFunction.substr(begin,end - begin) + "(...)");
}
它的作用:
- 需要
__PRETTY_FUNCTION__
- 它删除了返回类型和所有参数
- 如果函数的参数为零,则附加
()
,否则附加(...)
- It takes
__PRETTY_FUNCTION__
- It removes return type and all arguments
- If the function has zero arguments, it appends
()
, otherwise(...)
特点:
- 处理命名空间、构造函数等
- 也适用于括号运算符!
限制:
- 它只适用于 gcc
- 在运行时而不是编译时创建
- 已分配堆.
- 不适用于 lambda,
__FUNCTION__
和__PRETTY_FUNCTION__
不不匹配 ...我几乎称它为编译器错误:)__FUNCTION__
看到operator()
__PRETTY_FUNCTION__
看到<lambda(...)>
- It only works with gcc
- Created at runtime rather than compile time
- Heap allocated.
- Does not work for lambdas,
__FUNCTION__
and__PRETTY_FUNCTION__
don't match... I would almost call it a compiler bug :)__FUNCTION__
sees anoperator()
__PRETTY_FUNCTION__
sees<lambda(...)>
这篇关于__func__ 和 __PRETTY_FUNCTION__ 之间的东西?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:__func__ 和 __PRETTY_FUNCTION__ 之间的东西?
基础教程推荐
- 从 std::cin 读取密码 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01