在本文中,我们将详细介绍__PRETTY_FUNCTION__、__FUNCTION__、__func__有什么区别?的各个方面,并为您提供关于function*gen()的相关解答,同时,我们也将为
在本文中,我们将详细介绍__PRETTY_FUNCTION__、__FUNCTION__、__func__ 有什么区别?的各个方面,并为您提供关于function *gen()的相关解答,同时,我们也将为您带来关于C++ 的 __LINE__和 __FUNCTION__、C++(11):宏定义__func__和__VA_ARGS__、C标准中一些预定义的宏,如__FILE__,__func__等、NSLog有一个Swift替代(@“%s”,__PRETTY_FUNCTION__)的有用知识。
本文目录一览:- __PRETTY_FUNCTION__、__FUNCTION__、__func__ 有什么区别?(function *gen())
- C++ 的 __LINE__和 __FUNCTION__
- C++(11):宏定义__func__和__VA_ARGS__
- C标准中一些预定义的宏,如__FILE__,__func__等
- NSLog有一个Swift替代(@“%s”,__PRETTY_FUNCTION__)
__PRETTY_FUNCTION__、__FUNCTION__、__func__ 有什么区别?(function *gen())
__PRETTY_FUNCTION__
,__FUNCTION__
,和它们之间的区别是__func__
什么?它们在哪里记录?我如何决定使用哪一个?
答案1
小编典典__func__
是一个隐式声明的标识符,当它在函数内部使用时扩展为包含函数名称的字符数组变量。它在 C99 中被添加到 C
中。从C99搂6.4.2.2/1:
标识符
__func__
由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明static const char __func__[] = "function-name";
出现,其中 function-name 是词法封闭函数的名称。该名称是函数的朴素名称。
请注意,它不是宏,在预处理过程中没有特殊含义。
__func__
在 C11 中被添加到 C 中,其中指定为包含“an implementation-de铿乶ed
string”(C11拥抱8.4.1[dcl.fct.def.general]/8),即不如 C 中的规范有用。(添加__func__
到 C
的最初提议是N1642)。
__FUNCTION__
是一些 C 编译器支持的预标准扩展(包括 gcc 和 Visual
C);一般来说,你应该__func__
在支持的地方使用它,并且只__FUNCTION__
在你使用不支持它的编译器时使用(例如,Visual
C,它不支持 C99 并且还不支持所有 C++0x,不支持提供__func__
)。
__PRETTY_FUNCTION__
是一个 gcc 扩展,与 基本相同__FUNCTION__
,除了对于 C
函数,它包含函数的“漂亮”名称,包括函数的签名。Visual C 有一个类似(但不完全相同)的扩展名,__FUNCSIG__
.
对于非标准宏,您需要查阅编译器的文档。Visual C 扩展包含在 C
编译器的“预定义宏”的 MSDN 文档中。gcc
文档扩展在 gcc 文档页面“函数名称作为字符串”中进行了描述。
C++ 的 __LINE__和 __FUNCTION__
Linux几个调试宏__FUNCTION__ ,__TIME__ ,__LINE__ ,__FILE__
这几个宏是编译器内置的,不是在哪个头文件中包含的;
__FUNCTION__ :函数名
__TIME__ :文件运行的时间
__LINE__ :所在行数
__FILE__:文件的名字
#include <stdio.h> int main()
{ printf("The file is %s.\n",__FILE__);
printf( "The date is %s.\n", __DATE__ );
printf( "The time is %s.\n", __TIME__
); printf( "This is line %d.\n", __LINE__ );
printf( "This function is %s.\n", __FUNCTION__ );
return 0;
}
C++(11):宏定义__func__和__VA_ARGS__
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
C标准中一些预定义的宏,如__FILE__,__func__等
C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __FILE__ 代表当前源代码文件名的字符串文字 __LINE__ 代表当前源代码中的行号的整数常量 __TIME__ 源文件编译时间,格式微“hh:mm:ss” __func__ 当前所在函数名 对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因为你可以很容易的知道程序运行到了哪个文件的那一行,是哪个函数。 下面一个例子是打印上面这些预定义的宏的。#include #include void why_me();int main(){ printf( "The file is %s.\n",__FILE__ ); printf( "The date is %s.\n",__DATE__ ); printf( "The time is %s.\n",__TIME__ ); printf( "This is line %d.\n",__LINE__ ); printf( "This function is %s.\n",__func__ ); why_me(); return 0;}void why_me(){ printf( "This function is %s\n",__func__ ); printf( "The file is %s.\n",__FILE__ ); printf( "This is line %d.\n",__LINE__ );}打印信息:The file is debug.c.The date is Jun 6 2012.The time is 09:36:28.This is line 15.This function is main.This function is why_meThe file is debug.c.This is line 27.
NSLog有一个Swift替代(@“%s”,__PRETTY_FUNCTION__)
NSLog(@"%s",__PRETTY_FUNCTION__)
通常这是从日志宏使用。
虽然Swift不支持宏(我想),我仍然想使用一个通用的日志语句,包括被调用的函数的名称。这是可能在Swift吗?
更新:
我现在使用这个全局函数进行日志记录:
public func EVLog<T>(object: T,filename: String = __FILE__,line: Int = __LINE__,funcname: String = __FUNCTION__) { var dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss:SSS" var process = nsprocessInfo.processInfo() var threadId = "?" println("\(dateFormatter.stringFromDate(NSDate())) \(process.processName))[\(process.processIdentifier):\(threadId)] \(filename.lastPathComponent)(\(line)) \(funcname):\r\t\(object)\n") }
然后,您可以调用:
EVLog("/(error)")
然后将看起来像这样:
6/19/2015 17:13:19:042 AppMessage)[3462:.] RootViewController.swift(68) getUser(): ERROR: Unable to get user
__FILE__ – String – 显示它的文件的名称。
__LINE__ – Int – 出现它的行号。
__COLUMN__ – Int – 它开始的列号。
__FUNCTION__ – String – 声明的名称。
今天关于__PRETTY_FUNCTION__、__FUNCTION__、__func__ 有什么区别?和function *gen()的分享就到这里,希望大家有所收获,若想了解更多关于C++ 的 __LINE__和 __FUNCTION__、C++(11):宏定义__func__和__VA_ARGS__、C标准中一些预定义的宏,如__FILE__,__func__等、NSLog有一个Swift替代(@“%s”,__PRETTY_FUNCTION__)等相关知识,可以在本站进行查询。
本文标签: