C++(11):宏定义__func__和__VA_ARGS__

字节觅星使
• 阅读 824

C语言在C99已经支持了__func__和__VA_ARGS__,C++11也将他们纳入了支持的预定义宏。

__func__会返回所在函数的函数名,__VA_ARGS__是变长参数的宏定义,是指在宏定义中参数列表的最后一个为省略号的参数。

他们与__FILE__(返回文件名)及__LINE__(返回行号)结合,通常用于打印调试信息:

#include <stdio.h>
#include <stdarg.h>
 
void pDebug(const char *file, const char *func, int line, const char *format, ...)
{
    va_list argp;
    va_start(argp, format);
    printf("%s[%s:%d]-> ", file, func, line);//输出带有,文件名,函数名,行号的调试信息
    vprintf(format, argp);//输出可变参数信息
    return;
}
 
#define PEDBUG(PFORMAT, ...) pDebug(__FILE__, __func__, __LINE__, PFORMAT, __VA_ARGS__)//通过宏定义将__func__与__LINE__在调用处展开
 
void doHello()
{
    PEDBUG("%s", "hello world");
}
 
int main()
{
    doHello();
    return 0;
}
 
//输出:doHello:17-> hello world
点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
4年前
C语言基础习题50例(十)46-50
知足常足,终身不辱。月圆缺,水满溢,事情到了极致一定会遭受祸患,只有懂得知足,才是富足。习题46宏define命令练习。实现思路:宏通过define命令定义,分为无参宏和带参宏,可以分别进行测试。这只是一种简单的字符串代换。代码如下:cinclude<stdio.hdefineTRUE1defineFALSE0
CuterCorley CuterCorley
4年前
C语言入门系列之9.预处理
在之前,已多次使用过以号开头的预处理命令,如包含命令include<stdio.h、宏定义命令definePI3.1415926535等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。一、无参宏定义1.基本使用无参宏的宏名后不带参数。其定义的一般形式为:cdefine标识符
Stella981 Stella981
3年前
C语言中size_t类型详细说明【转载】
来看看网上的一些说法:C语言size_t到底是个什么东东?大神求解1.简单理解为unsignedint就可以了2.这是在不同的机器里面的的头文件定义的相应宏定义,实际上是unsignedint。3.无符号整型。4.大部分情况下是unsigne
Stella981 Stella981
3年前
C++系统学习之C库assert
C库之<cassertassert.h定义了一个作为标准调试工具的宏宏函数函数说明assertEvaluateassertion(macro)assert当使用assert()里,给它一个参数,即一个表示断言为真的表达式。预处理器产生测试该断言的代码。如果断言不为真,则发出一
Wesley13 Wesley13
3年前
IOS开发之_短信发送与拨打电话
首先宏定义一个号码:define PhoneNumber @"18188888888" / 宏定义一个号码 /短信发送的两种方式:方式一使用系统底层的发送:    / 底层发送方式 /    / 缺点: 无法自定义短信内容,无法返回原来应用; /    NSURL url  
Stella981 Stella981
3年前
C# 调用 Delphi DLL
l技术实现如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可:defineLIBEXPORT_APIextern"C"__declspec(dllexport)第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一
Wesley13 Wesley13
3年前
Mysql自定义函数(function)
语法自定义函数也需要相应的要求,语法如下:_CREATEFUNCTION__<函数名称(参数列表)__RETURNS返回值类型_  函数体删除:_DROP__FUNCTION <函数名称_调用自定义函数语法:_SELECT <函数名称(paramet
Stella981 Stella981
3年前
ReactiveCocoa中weakify与strongify的作用
@weakify(Obj) @strongify(Obj)这对宏在RACEXTScope.h中定义,RACFramework好像没有默认引入,需要单独import他们的作用主要是在block内部管理对self的引用:@weakify(self); //定义了一个\_\_weak的self\_weak\_变量\RACObserve
Wesley13 Wesley13
3年前
C语言宏定义中#用法
宏中""和""的用法一、一般用法我们使用把宏参数变为一个字符串,用把两个宏参数贴合在一起.用法:#include<cstdio#include<climitsusing namespace std;define STR(s)     sdefine CONS(a,b)  int
Stella981 Stella981
3年前
Sass之混合宏、继承、占位符
  1、混合宏。    当样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到我们目的了。这个时候混合宏就派上用场了。  而使用混合宏时,首先要声明混合宏,而声明混合宏时有两种,不带参数混合宏和带参数混合宏两种。  1.1不带参数混合宏的声明要使用关键词@mixin。例如:  @mixinborderradi
Wesley13 Wesley13
3年前
2. 预处理指令
2\.预处理指令2.1宏定义。define指令定义一个宏,undef指令删除一个宏2.2文件包含。include指令将包含当前文件到程序中。2.3条件编译。if、ifdef、ifndef、elif、else和endif,将根据条件包含代码块到程序当中,或将代码块排除在程序外。预定义指令的规则