首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在C++中,可以使用__func__宏来获取当前函数的函数名。__func__宏返回一个包含当前函数名的字符串字面量。

例如:

代码语言:cpp
复制
#include<iostream>

void print_function_name() {
    std::cout << "Function name: " << __func__<< std::endl;
}

int main() {
    print_function_name();
    return 0;
}

输出:

代码语言:txt
复制
Function name: print_function_name

需要注意的是,__func__宏是C++11标准引入的,因此在使用时需要确保编译器支持C++11标准。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在 Go 函数获取调用者的函数名、文件名、行号...

背景 我们应用程序的代码添加业务日志的时候,不论是什么级别的日志,除了我们主动传给 Logger 让它记录的信息外,这行日志是由哪个函数打印的、所在的位置也是非常重要的信息,不然排查问题的时候很有可能就犹如大海捞针...对于在记录日志时记录调用 Logger 方法的调用者的函数名、行号这些信息。...如果让我们用 Go 设计一个Log Facade,就需要我们自己门面里获取调用者的函数名、文件位置了,那么Go里面怎么实现这个功能呢?...、该调用在文件的行号。...获取调用者的函数名 runtime.Caller 返回值第一个返回值是一个调用栈标识,通过它我们能拿到调用栈的函数信息 *runtime.Func,再进一步获取到调用者的函数名字,这里面会用到的函数和方法如下

6.2K20

Linux+Windows: 程序崩溃时, C++ 代码,如何获取函数调用栈信息

一、前言 二、Linux 平台 三、Windwos 平台 一、前言 程序执行过程 crash 是非常严重的问题,一般都应该在测试阶段排除掉这些问题,但是总会有漏网之鱼被带到 release 阶段。...因此,程序的日志系统需要侦测这种情况,代码崩溃的时候获取函数调用栈信息,为 debug 提供有效的信息。...这篇文章的理论知识很少,直接分享 2 段代码: Linux 和 Windows 这 2 个平台上,如何用 C++ 来捕获函数调用栈里的信息。 二、Linux 平台 1....,从地址转换为函数名称。...利用以上几个神器,基本上可以获取到程序崩溃时的函数调用栈信息,定位问题,有如神助! ----

5.5K20

C++ 继承函数、纯虚函数、普通函数,三者的区别

https://blog.csdn.net/jxq0816/article/details/82625408 1.虚函数(impure virtual)   C++的虚函数主要作用是“运行时多态...; } }; 2.纯虚函数(pure virtual)        C++包含纯虚函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   C++的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...C++的纯虚函数也是一种“运行时多态”。   ...普通函数是父类为子类提供的“强制实现”。   因此,继承关系,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

1.2K30

c语言random函数vc,C++ 随机函数random函数的使用方法

C++ 随机函数random函数的使用方法 一、random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。 可改用C++下的rand函数来实现。...1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。...(但这样便于程序调试) 2、C++另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。...通常rand()产生的随机数每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。...三、按要求设置概率 比如要设置一个10%的概率问题,我们可以采取rand()函数来实现,if条件句判断里,用rand()得到的值%一个设定的值,再与另一个值做“==”运算。

3.9K20

C++】仿函数模板的应用——【默认模板实参】详解(n)

一.引入:查看(容器)文档时常常遇到的场景 我们https://cplusplus.com/reference/forward_list/forward_list/查看类模板时,常常会看到这些东西,...其实我们在学习函数参数时也知道默认实参,但在类模板遇到这种往往犯迷糊;我们直接给出结论:allocator是一个仿函数默认模板实参 二.默认模板实参详解(含代码演示) 前置知识: 仿函数...:把一个类用()重载(类实现一个operator()),让其能够实现函数的功能 我们可以举一个例子:我们重写 compare,默认使用标准库的 less 函数对象模板 // compare 有一个默认模板实参...: 我们为此模板参数提供了默认模板实参less并为其对应的函数参数也提供了默认实参T 默认模板实参指出:compare 将使用标准库的 less 函数对象类(即仿函数),它是使用与 compare...一的类型参数实例化的 默认函数实参指出f将是类型E的一个默认初始化的对象 当用户调用这个版本的 compare 时,可以提供自己的比较操作,但这并不是必需的 与函数默认实参一样,对于一个模板参数,只有当它右侧的所有参数都有默认实参时

9010

让Python提速超过30倍的必杀技:Cython

如果你的代码是纯Python、或者必须用一个大的for循环并且不能放入矩阵因为数据必须按顺序处理的时候,有没有办法加速Python呢?本文为你解答。...Cython将CPython代码转译成 C 或 C++ 语法后,自动包装上式呼叫界面生成 .pyx 后缀的执行档,即可当成普通的式库。...其性能一般逊于原生的 C/C++ 式库,但由于 CPython 语法的易用性可以缩短开发时间。Cython 也可以用于编译以 C/C++ 为 CPython 撰写的式库。...另外还需要为函数的所有变量设置类型从而告知C编译器。...Cython代码所在的文件夹拥有运行C代码所需的所有文件,包括run_cython.c文件,你尽可以进去仔细看个究竟。 现在,我们要测试全新超快速C代码了!准备好了吗?3、2、1、go!

1.2K20

让Python提速超过30倍的必杀技:Cython

如果你的代码是纯Python、或者必须用一个大的for循环并且不能放入矩阵因为数据必须按顺序处理的时候,有没有办法加速Python呢?本文为你解答。...Cython将CPython代码转译成 C 或 C++ 语法后,自动包装上式呼叫界面生成 .pyx 后缀的执行档,即可当成普通的式库。...其性能一般逊于原生的 C/C++ 式库,但由于 CPython 语法的易用性可以缩短开发时间。Cython 也可以用于编译以 C/C++ 为 CPython 撰写的式库。...另外还需要为函数的所有变量设置类型从而告知C编译器。...Cython代码所在的文件夹拥有运行C代码所需的所有文件,包括run_cython.c文件,你尽可以进去仔细看个究竟。 现在,我们要测试全新超快速C代码了!准备好了吗?3、2、1、go!

3.8K20

C++类的成员函数 | 成员函数

C++成员函数的性质 C++,类的成员函数函数的一种,它有返回值和函数类型,它与一般函数的区别只是:  属于一个类的成员,出现在类体。...C++,有的函数并不是准备为外界调用的,而是为本类的成员函数所调用的,就应该将它们指定为 private。...C++类外定义成员函数 上述所讲成员函数类体定义的,C++也可以类体只写成员函数的声明,而在类的外面进行函数定义。...endl;     }; Student stu1,stu2;//定义了Student类对象 C++类体中直接定义函数时,不需要在函数名前面加上类名,但成员函数类外定义时,必须在函数名前面加上类名,...//作用域限定符 ∷ C++,用作用域限定符声明 数是属于哪个类的,如果在作用域运算符的前面没有类名,或者函数名前面既无类名又无作用域限定符,则表示函数不属于任何类,这个函数不是成员函数,而是全局函数

1.8K74

C++函数定义 | 输出有参无参

C++无参函数的定义 上一节小林已经讲过,从函数形式来看,函数分为无参函数和有参函数,那么他们有什么不同呢?...定义无参函数的一般形式为 类型标识符 函数名([void])//注意void可以省略不写 {   声明部分   语句 } C++有参函数的定义 有参函数,顾名思义,有参数的函数,和无参函数相比,有参函数多了参数...,定义如下所示 类型标识符 函数名(形式参数表列) {   声明部分   语句 } 学习了无参函数和有参函数的不同,接下来看一个例子巩固下知识点 经典案例:C++实现无参数和有参数函数,并输出相应文字描述...PrintFace(3);//调用有参函数    return 0;//函数返回值为0  } 执行本程序之后,会输出 我是无参函数 ---------------- 3 我是有参函数 --------...C++输出有参无参 更多案例可以go公众号:C语言入门到精通

1.4K2927

C++函数详解:多态性实现原理及其面向对象编程的应用

C++是一种面向对象的编程语言,C++,虚函数是实现多态性的关键 什么是虚函数函数是一个基类声明的函数,它可以被子类重写并提供不同的实现。...C++,使用关键字virtual来声明一个虚函数。虚函数的原理是将函数调用的控制权交给运行时环境,而不是编译时环境。因此,虚函数的实现需要在运行时才能确定。...虚函数的声明形式如下:  virtual 返回类型 函数名(参数列表) {    // 实现代码  } 例如:  class Shape {    public:      virtual void draw...注意,Circle类的重写函数中使用了override关键字,这是C++11引入的新特性,表示该函数是对基类同名函数的重写。...这种行为称为运行时多态性,因为实际调用的函数是在运行时确定的。 多态的底层原理 C++,多态是通过虚函数表和虚指针来实现的。虚函数表是一个特殊的表格,其中包含了虚函数的地址。

72310

ndk C++ 编译器的函数名修饰规则

当然,某些情况下需要指定函数的名字修饰,例如在C++程序, 为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。...另一种需要指定函数的 名字修饰的情况是汇编程序调用C或C++函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的 名字修饰。...无论是C函数名修饰方式还是C++函数名修饰方式均不改变输出函数名的字符大小写,这和PASCAL调用约定不同,PASCAL约定输出的函数名无任何修饰且全部大写。...MakeFun的函数认为是 __cdecl调用方式,b模块的这些函数调用完MakeFun当然要帮着恢复堆栈啦,可是MakeFun已经结束时自己恢复了堆栈,b模块 数这样多此一举就引起了栈指针错误...但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就出现来:CPU,计算机没有办法知道一个函数调用需 要多少个、什么样的参数,也没有硬件可以保存这些参数。

2K31

CC++ 单元自动化测试解决方案实践

一、动机 上图展示了C/C++单元测试的基本流程,日常开发过程写单元测试是一项比较大工程量的事情,C/C++ 目前单元测试代码都需要自己手动写,而且对于一些私有方法打桩就更加麻烦。...如何改善编写单元测试的效率,提升C/C++同学开发效率以及程序质量?我们可以通过提取源文件函数、类等信息,然后生成对应的单元测试用例。...例如:如下的函数定义: void test(int arg) {} 我们希望能够从上面的函数定义得到函数的返回值类型、函数名称、函数参数类型、函数作用域。...通常我们可以通过以下几种方式得到: 1.1 方法1:使用正则表达式 无奈C/C++ 格式比较复杂能够虽然能够使用多种组合来获取对应的函数声明等信息: void test(int arg){} void...GCC将用户注册插件事件保存到数组: 然后在编译构建过程到就会去查找对应的事件有没有设置回调方法如果设置则进行调用,TU主要使用以下几种插件: PLUGIN_INCLUDE_FILE 用于获取当前文件的所包含的头文件

1.5K30

函数模板 ## 函数模板

方法:对于给定的函数名,可以有⾮模板函数、模板函数和显式具体化模板函数以及它们的重载版本。...包含函数模板本⾝并不会⽣成函数定义,它只是⼀个⽤于⽣成函数定 义的⽅案。...⽤⼾定义的转换,如类声明定义的转换。完全匹配和最佳匹配 Type(argument-list)意味着⽤作实参的函数名与⽤作形 参的函数指针只要返回类型和参数列表相同,就是匹配的。 !...- ⼀个完全匹配优于另⼀个的另⼀种情况是,其中⼀个是⾮模板 数,⽽另⼀个不是。在这种情况下,⾮模板函数将优先于模板函数(包 括显式具体化)。...```c++ 20 15.5 -30 15 ``` - lesser(m, n)的指出,编译器应选择模板函数,⽽不是⾮模板 函数;编译器注意到实参的类型为int,因此使⽤int

2.1K10

C++入门学习指南】:函数重载提升代码清晰度与灵活性

1.3 C++支持函数重载的原理 C++支持函数重载,但是C语言不支持函数重载,这是为什么呢? C/C++,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接 。...实际项目通常是由多个头文件和多个源文件构成,当前a.cpp调用了b.cpp定义的Add函数时,编译后链接前,a.o的目标文件没有Add的函数地址,因为Add是b.cpp定义的,所以Add的地址...C语言编译后:函数名字的修饰没有发生改变。 C++编译后:函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字。 以上我们可以看出gcc的函数修饰后名字不变。...而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。 这里就理解了C语言没办法支持重载,因为同名函数办法区分。...而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。

11000

C++函数重载

前言 我们知道使用C语言进行编程时,可能会产生函数名称出现冲突的情况,对此C++的解决办法是引入命名空间,不同域内可以出现相同名称的函数。...那么如果我们希望几个函数同一个域内并且函数名相同,有什么办法吗?这就涉及到我们今天要了解的内容——函数重载。...C语言和C++函数修饰规则不同: C语言形成的符号表函数名,只有用户自定义的函数名而没有其他的修饰。...因此两个相同名称的函数符号表函数名是相同的,相当于同一个函数名有两个地址,编译器不知道应该使用哪个地址调用该函数。因此,C语言不能支持函数重载。...C++函数函数名不仅包含用户自定义的函数名,还使用函数的参数对函数名进行了修饰。因此两个同名,但是参数部分有区别的函数C++函数调用是可以被区分开的。因此,C++支持函数重载。

20410

Android JNI学习(三)——Java与Native相互调用

这样是很好,所以说JNI肯定要支持的,那JNI要怎么支持那,如果仅仅是根据函数名,没有办法找到重载的函数的,所以为了解决这个问题,JNI就衍生了一个概念——"签名",即将参数类型和返回值类型的组合。...如果拥有一个该函数的签名信息和这个函数函数名,我们就可以顺序的找到对应的Java层函数了。...Java类的方法,其实在jni.h已经定义了一系列函数来实现这一目的,下面我们就以此举例说明: (一)、获取Class对象 为了能够C/C++调用Java的类,jni.h的头文件专门定义了jclass...jclass对象 (二)、获取属性方法 Native本地代码访问Java层的代码,一个常用的常见的场景就是获取Java类的属性和方法。...所以为了C/C++获取Java层的属性和方法,JNIjni.h头文件定义了jfieldID和jmethodID这两种类型来分别代表Java端的属性和方法。

1.9K30

如何理解jsonp的原理

当我们用ajax请求一个跨域的域名时会报如下错误 这是因为浏览器基于同源策略,同源策略下浏览器不允许AjAX跨域获取服务器数据 同源策略是浏览器的安全策略,指的是请求URL地址的协议,域名和端口都与当前发送请求的页面相同...那如果我们想跨域获取数据是不是就没办法了?...由于是异步请求,还没有获取到data时我们就将其打印,所以出现上面错误 一个完美的解决办法就是通过函数调用,既然服务端可以给我们返回一段js代码,并且在请求服务端后我们可以拿到那段js代码,那我们使服务端返回一个...}//请求完成 callback(123);//返回123 实际上面操作就已经完成了一次jsonp,但是还是不够完美,只能说其像jsonp(后面我们会提到其概念),为什么说他不够完美,不知道你有没有发现我们前端定义的函数必须与后端调用的函数一致才能获取到数据吧...实际开发我们也不可能要求第三方的回调函数和我们前端定义的函数保持一致吧,那有没有一种方案,使我们定义的函数不管是什么都能正常获取数据呢?

40020
领券