GVKun编程网logo

__PRETTY_FUNCTION__、__FUNCTION__、__func__ 有什么区别?(function *gen())

17

在本文中,我们将详细介绍__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())

__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__

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++(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标准中一些预定义的宏,如__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有一个Swift替代(@“%s”,__PRETTY_FUNCTION__)

在Objective C中,您可以使用以下方法记录正在调用的方法:
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
Swift有__FILE__,__FUNCTION__,__LINE__和__COLUMN__。从 Swift Programming Language:

__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__)等相关知识,可以在本站进行查询。

本文标签: