__FILE__,__LINE__,__FUNCTION__的问题

#define MYCODE __FILE__,__LINE__,__FUNCTION__
#define MYCODE2 mycall(__FILE__,__LINE__,__FUNCTION__);

void mycall(char* file=__FILE__,int line=__LINE__,const char* function=__FUNCTION__)
{
 printf("%s:%d %s\n",file,line,function);
 printf("%s:%d %s\n",__FILE__,__LINE__,__FUNCTION__);
}

int main()
{
 mycall(__FILE__,__LINE__,__FUNCTION__);
 mycall();
 mycall(MYCODE);
 MYCODE2
 return 0;
}

打印结果:

/root/code/testexe/src/testexe.cpp:380 main
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:372 
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:382 main
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:383 main
/root/code/testexe/src/testexe.cpp:375 mycall

可见,作为默认参数,只是函数声明的文件和行数,没有函数名。
作为宏定义的话,不是宏定义申明的位置,而是实际调用的位置。

ANSI标准说明了五个预定义的宏名。它们是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
C++中还定义了 __cplusplus

如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。

__LINE__ 及 __FILE__ 宏指示,#line指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。

__DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
__TIME__ 宏指令包含程序编译的时间。时间用字符串表示,其形式为: 分:秒
__STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。
__cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。与标准c++不一致的编译器将使用具有5位或更少的数值。

时间: 2024-10-05 20:12:42

__FILE__,__LINE__,__FUNCTION__的问题的相关文章

__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )

[email protected]:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        #include <stdio.h>        int funca(void);        int funcb(void);#endif[email protected]:~/cpropram/2# cat funca.c //函数a#include "global.h"i

__FILE__,__LINE__

编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C

Duanxx的C++学习: 使用__FILE__,__LINE__,__VA_ARGS__调试代码

__FILE__,__LINE__ 在调试C/C++代码的时候,我们最想知道的,当然是程序当前走到了哪个文件的第几行了,这里有两个宏:__FILE__和__LINE__,返回的是当前文件的路径,和当前行. 这里测试代码如下: #include <cstdio> int main() { printf("%s : %d",__FILE__,__LINE__); printf("\n"); return 0; } Windows下运行结果为: Linux系统

C/c++几个预定义的宏:__DATE__,__TIME__,__FILE__,__LINE__

一边情况下,C/C++编译器会内置几个宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C++

__FILE__,__LINE__,__DATE__,__TIME__ c++常用的预定义名字

C++有四个常用的预定义名字,分别为:__FILE__,__LINE__,__DATE__,__TIME__ __FILE__:记录文件的路径加名称 __LINE__:记录文件已经被编译的行数 __DATE__:记录文件的编译日期 __TIME__:记录文件的编译时间 可以当作变量直接使用,一般用作程序调试 例子: #include <iostream> using namespace std; int main(){     cout << "File = "

__FILE__ __LINE__ __DATE__ __TIME__宏

项目中总是看到__FILE__ __LINE__的玩意,想起来曾经在Linux内核源码中也看到过类似的东西.抽时间查了查这玩意是什么. 简单而言.是ANSI C预定义的宏.有这么几个,注意前后都是两个下划线 __FILE__ :表示源文件名称(不是可执行文件),字符串类型 __LINE__:源码行数,整形 __DATE__:编译日期,字符串 __TIME__:编译时间,字符串 一般都是在生成日志文件的时候用,常常还结合可变参数函数的使用.关于可变参数的问题,请看我另一篇文章C语言可变参数函数 比

C/C++ __FILE__,__LINE__输出调试信息

在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下.所以,很多人会选择使用宏定义的方式来输出调试语句. 编译器内置宏,ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:    在源代码中插入当前源代码行号: __FILE__:  

宏 __LINE__ __FILE__ __FUNCTION__

C的这些宏有什么意义呢 __LINE__ __FILE____DATE____TIME__ __STDC__ __FUNCTION__ #include   <iostream> using   namespace   std; void   main(void) { cout   < <   __FILE__   < <   endl;   //   当前文件路径 cout   < <   __LINE__   < <   endl;   //

一个打印调试信息的样例

作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz #include <stdio.h> #define HAOYU_DEBUG_TYPE #ifdef HAOYU_DEBUG_TYPE #define HAOYU_DEBUG(...) do { printf("\n[HAOYU_DEBUG] ------------------ in %s:%d %s()------------------\n", __FILE__, __LINE__,