有没有办法在 C++ 函数中获取函数名称?

2024-03-07

我想实现一个函数跟踪器,它可以跟踪函数执行所花费的时间。我有以下相同的课程:-

class FuncTracer
{
    public:
        FuncTracer(LPCTSTR strFuncName_in)
        {
            m_strFuncName[0] = _T('\0');
            if( strFuncName_in ||
                _T('\0') != strFuncName_in[0])
            {   
                _tcscpy(m_strFuncName,strFuncName_in);

                TCHAR strLog[MAX_PATH];
                _stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
                LOG(strLog)

                m_dwEnterTime = GetTickCount();
            }
        }

        ~FuncTracer()
        {
            TCHAR strLog[MAX_PATH];
            _stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
            LOG(strLog)
        }

    private:
        TCHAR m_strFuncName[MAX_PATH];
        DWORD m_dwEnterTime;
};

void TestClass::TestFunction()
{
    // I want to avoid writing the function name maually..
    // Is there any macro (__LINE__)or some other way to 
    // get the function name inside a function ??

    FuncTracer(_T("TestClass::TestFunction"));
    /*
     * Rest of the function code.
     */
}

我想知道是否有什么方法可以从函数内部获取函数的名称?基本上我希望我的班级的用户简单地创建一个相同的对象。他们可能不传递函数名称。


C99 has __func__,但对于 C++,这将是特定于编译器的。从好的方面来说,一些特定于编译器的版本提供了额外的类型信息,当您在模板化函数/类中进行跟踪时,这尤其有用。

  • MSVC http://msdn.microsoft.com/en-us/library/b0084kay.aspx: __FUNCTION__, __FUNCDNAME__, __FUNCSIG__
  • GCC http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html: __func__, __FUNCTION__, __PRETTY_FUNCTION__

Boost库已经定义了宏BOOST_CURRENT_FUNCTION对于标头中的大多数 C++ 编译器升压/current_function.hpp http://www.boost.org/doc/libs/1_62_0/boost/current_function.hpp。如果编译器太旧而无法支持此功能,则结果将为“(未知)”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在 C++ 函数中获取函数名称? 的相关文章

随机推荐

  • Cakephp 2.3.x 发送文件并强制下载 mp4 文件

    我正在使用 cakephp 2 3 1 我想强制下载一个 mp4 文件http book cakephp org 2 0 en controllers request response html cake response file htt
  • Protractor:onPrepare 不同的测试套件

    我登录应用程序的 conf js 文件中有 onPrepare 我的理解是每次我运行 1 个或多个测试套件时 它首先执行 onPrepare 中的任何内容 这很棒 因为我在运行测试之前使用 onPrepare 登录到应用程序 问题是 当我运
  • ggplot2中直方图条形的反向填充顺序

    我注意到 使用绘图创建的直方图中填充条形的默认情况是按字母顺序逆序排列 而图例则按字母顺序排列 我有什么办法让两者按字母顺序排序吗 问题在下面的示例图中很明显 额外问题 如何将从左到右的条形顺序从字母顺序更改为递减计数总数 谢谢 df lt
  • 在部分视图中进行不显眼的客户端验证

    我有一个在 jQuery UI 对话框中呈现的部分视图 因为它是动态内容 所以不引人注目的客户端验证不起作用 为了得到它 我必须强制验证器解析表单的内容调用 validator unobtrusive parse 但这不起作用 我的浏览器报
  • SQL 按版本“编号”排序,不同长度的字符串

    我正在尝试创建一个 SQL 查询 该查询将按版本号 例如 1 1 4 5 10 等 对结果进行排序 这是我尝试过的 SELECT FROM Requirements WHERE Requirements Release NOT LIKE O
  • 每周数据的时间序列分解

    我对 R 完全陌生 刚刚开始使用它 我有三年的每周数据 我想将这个时间序列数据分解为趋势 季节性和其他组成部分 我有以下疑问 我应该使用哪个功能 ts or decompose 如何应对闰年的情况 如果我错了请指正 频率是52 提前致谢 我
  • PyQt5 + Python 3:跨线程传递列表、字典作为信号参数

    我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程 qt 何时创建作为参数传递的对象的副本 根据 http www embeddeduse com 2013 06 29 copied or not cop
  • Java优化的Cramers规则函数

    最近了解了初级微积分中的 Cramers 规则 并决定用 Java 制作一个算法来帮助我更好地理解它 以下代码 100 正确运行 但是它不使用任何类型的 for 循环来以更简单的方式执行其操作 问题 Java 中是否有更优雅的 Cramer
  • 如何清除 IDLE shell 中所有文本的屏幕?

    我想为 python 游戏创建一个基于文本的 GUI 我打算在多行文本之间移动一个字符 经过几个小时的在线搜索后 我发现的解决方案对此不起作用 我想要一些能够擦除屏幕上所有文本的东西 这样我就可以重新打印同一行 但角色移动了一个空格 需要明
  • range() 不是每次都会计算它的参数吗?

    l作为参数传递给range其值在内部被修改的函数for循环 但循环是为了10次而不是5 i 0 l 10 for i in range l print i l l l 1 输出是 0 10 1 9 2 8 3 7 4 6 5 5 6 4 7
  • 无法打开应用程序“Eclipse”。 -10810

    更新android L Preview的SDK后 我尝试将ADT从adt 22更新到23 但它说版本冲突 所以无法更新ADT然后我通过about eclipse卸载了ADT插件 重新启动eclipse后没有打开 它显示警告 因为无法打开应用
  • 使用 jOOQ 实现带间隔的 date_sub() 函数

    我从昨天起就一直在处理这个问题 问题是我正在将查询迁移到jOOQ http www jooq org当我尝试实现这一部分时 我陷入了困境 select from table where condition1 and date1 gt dat
  • 登录 Groovy 脚本

    我有一个基本的 Groovy 脚本 我希望尽可能简单地创建日志 我希望消息发送到标准输出以及日志文件 并且日志文件中的每个条目都有一个时间戳 我无法使用 Log 表示法 因为它是一个脚本 而且我没有要注入的类 否则我认为这将是理想的 您可以
  • Laravel 验证独特

    我有一个带有唯一列的表 我的表单验证规则如下所示 return Validator make data nameEN gt required string nameHE gt required string address gt requi
  • spring @Transactional 注解

    我有一个抽象类和两个扩展它的子类 我在 spring 配置文件中有以下内容
  • 如何配置 xdebug stacktrace 以链接到 VS Code 中的文件并打开文件

    当 xdebug 提供堆栈跟踪时 它可以创建链接以在文本编辑器中的特定行打开文件 例如 如果安装了 subl 处理程序 以下配置将在 Sublime 中打开文件 xdebug file link format subl open url f
  • 响应式设计 - 适用于智能手机和平板电脑的标准断点/媒体查询

    当您进行响应式设计编码时 智能手机和平板电脑的标准宽度是多少 我查看了不同的网站 但似乎没有找到任何好的标准宽度模板 你们在编码响应式设计时通常对断点 媒体查询做什么 如果有人有适合平板电脑 智能手机等的不同分辨率的好模板 请分享 谢谢 有
  • 如何以编程方式确定 VB 应用程序日志的位置?

    我正在改造一个旧的 vb net 应用程序 使其符合 Vista 中的 LUA 原则 到目前为止 应用程序使用了多种日志记录机制 但核心机制涉及将日志写入到 c temp 如果该文件夹存在 我想用更标准的日志记录机制替换当前的日志记录 这是
  • Dataframe_image OsError:无法在您的计算机上找到 Chrome 可执行文件

    我正在尝试运行我的脚本数据块 using 数据框 图像库来设置我的表格样式 然后将其另存为 png 文件并收到错误OsError 无法在您的计算机上找到 Chrome 可执行文件 Per 文档 https pypi org project
  • 有没有办法在 C++ 函数中获取函数名称?

    我想实现一个函数跟踪器 它可以跟踪函数执行所花费的时间 我有以下相同的课程 class FuncTracer public FuncTracer LPCTSTR strFuncName in m strFuncName 0 T 0 if s