c语言获取函数名的宏 c语言获取文件名函数

C语言__func__是一个系统预定义宏 , 功能是以字符串形式输出当前函数名,那么这个系统宏是怎么实现的?【c语言获取函数名的宏 c语言获取文件名函数】Func 是你自己定义的函数的名字 。例:void func1(int i),其中void指的是返回值类型是空,默认情况下指的是int型,func1是你定义的函数名 , int i是你定义一个形式参数,类型是整型的
C语言 Linux 获取调用者函数名称可以做到的,参考一下backtrace_symbols的实现以及相关原理,这里面比较复杂,也比较底层 , 一两句话说不清楚
你要是想通过_FUNCTION_这种方式来搞的话,可以通过如下方式:
#define m_fun(args) fun(__FILE__,__LINE__, args)
进行相应的替换即可
c语言中的“宏”是指什么?宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串 。
1、条件编译:
C语言中 , 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号 。
预处理指令是以#开头的代码行 , #必须是该行除了空白字符外的第一个字符 。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符 。
使用宏进行条件编译的用法与使用宏防止多重引用类似 。示例如下:
使用条件编译,方便程序员在调试程序的过程中,执行一些在程序发布后并不需要执行的指令 。只要在需要调试的代码前加上_DEBUG的定义 , 就可以在调试程序的过程中输出调试信息 。
这样方便查看程序在运行过程中有没有出现错误,定位错误出现的地方 。而在程序发布之前 , 取消_DEBUG的定义就可以不再执行调试代码 。
2、宏函数:
函数的调用是需要一定的时间和空间代价的 。因为系统在调用函数时,需要保留"现场",即将程序要执行的指令的下一条指令的位置压入栈,然后转入调用函数去执行,调用完函数后再返回主调函数 , 恢复"现场",返回到栈里保存的的下一条指令的位置继续执行 。
所以函数的调用需要额外的时间和空间代价 。
而宏函数则不存在上述问题,宏函数在预编译时,同函数定义的代码来替换函数名,将函数代码段嵌入到当前程序,不会产生函数调用 。
所以会省去普通函数保留现场恢复现场的时间,但因为要将定义的函数体嵌入到当前程序,所以不可避免的会占用额外的存储空间 。
在频繁调用同一个宏的时候,该现象尤其明显 。宏函数的示例定义如下:
#define MAX(a,b) ((a)(b)?(b):(a))
宏函数的优点在于避免函数调用,提高程序效率 。
同时需要注意的是inline标识符 。inline也将函数定义为内联的 。但是使用内联函数需要注意的是:函数体必须十分简单,不能含有循环、条件、选择等复杂结构,否则就不能作为内联函数了 。
事实上,有时候即便你没有将函数指定为内联函数,编译器也会将一些简单的函数作为内联函数处理,而对于一些复杂的函数 , 即使声明为内联函数,编译器也不会理会的 。
inline函数的瓶颈就在于此,使用inline标识符将函数声明为内联的 , 但这只是一种提示,到底编译器有没有优化还依赖于编译器的实现,而使用宏函数则完全由代码本身控制 。
但在使用宏函数的时候,需要明确的是宏函数只是简单的替换,需要注意括号的使用 。
扩展资料:
宏的更多规则特性:
(1)宏名一般用大写 。
(2)使用宏可提高程序的通用性和易读性 , 减少不一致性,减少输入错误和便于修改 。例如:数组大小常用宏定义 。

推荐阅读