编译器内置宏__LINE__

编译器内置宏:

先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

ANSI C标准中有几个标准预定义宏(也是常用的):

__LINE__:在源代码中插入当前源代码行号;

__FILE__:在源文件中插入当前源文件名;

__DATE__:在源文件中插入当前的编译日期

__TIME__:在源文件中插入当前编译时间;

__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

__cplusplus:当编写C++程序时该标识符被定义。

编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

看到这里,你的眼睛应该一亮了吧,嗯,是的,__FILE__和__LINE__正是我们前面想要的输出的,于是,我们的每一条语句都变成了:

DEBUG("FILE: %s, LINE: %d…",__FILE__,__LINE__,…)

其实没有必要,__FILE__本身就会被编译器置换为字符常量,于是乎我们的语句又变成了这样:

DEBUG("FILE:"__FILE__", LINE: %d…",__LINE__,…)

但是,我们还是不满足,依然发现,还是很讨厌,为什么每条语句都要写"FILE:"__FILE__", LINE: %d 以及,__LINE,这两个部分呢?这不是浪费我们时间么?

哈哈,是的,这就是本次大结局,把DEBUG写成这样:

DEBUG(format,...) printf("FILE: "__FILE__", LINE: %d: "format"/n", __LINE__, ##__VA_ARGS__)

没错,就是这样!下面,所有的DEBUG信息都会按照这样的方式输出:

FILE: xxx, LINE: xxx, …….

最后:

最后,老规矩,coding测试。

  1. //============================================================================
  2. // Name : debug.cpp
  3. // Author : boyce
  4. // Version : 1.0
  5. // Copyright : pku
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #include
  9. #define __DEBUG__
  10. #ifdef __DEBUG__
  11. #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)
  12. #else
  13. #define DEBUG(format,...)
  14. #endif
  15. int main() {
  16. char str[]="Hello World";
  17. DEBUG("A ha, check me: %s",str);
  18. return 0;
  19. }

测试结果:

转自:http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html

时间: 2024-10-16 16:22:18

编译器内置宏__LINE__的相关文章

常见的编译器内置宏

ANSI C标准中几个标准预定义宏,方便调试: __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C++程序时该标识符被定义. 代码示例: 输出结果: 原文地址:https://www.cnblogs.com/tongyishu/p/12193676.

编译器内置宏

看了http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html,所以自己写了几行代码测试了下 #include <stdio.h> int main() { printf("date:%s",__DATE__); printf("time:%s",__TIME__); printf("lineNum:%d",__LINE__); printf(&q

一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就会提示,在某个文件的某一行有错误,这是怎么做到的呢?事实上是使用了C语言的内置宏. 说到宏,我想大家都知道,而所谓的内置宏相似于C语言的关键字,它是C语言自定义的,因此我们不须要定义宏,就能够直接使用.经常使用的内置宏有"_LINE_"和"_FILE_".假设把它们放到

C++ 内置宏定义 与 预编译指令

内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE____TIME__ __FUNCTION__ 2.预编译指令 可以防止头文件被多次引用 可以方便解决代码跨平台编译问题 可以根据自定义变量灵活执行程序 等等,许多好处 效果可以看代码实例: test.h 1 #ifndef __TEST_H 2 #define __TEST_H 3 4 #incl

一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)

各位看官们,大家好,上一回中咱们说的是C语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在第一百二十四回中介绍了C语言中的内置宏,当时介绍了常用的内置宏_LINE_和_FILE_.并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名.大家都知道,这两个内置宏经常被用来在文件中添加调试信息.因为我们写的程序难免会有错误,所以需要对程序进行调试.在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个

查看GCC的内置宏定义

开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就可以搞定了... 原文地址:https://www.cnblogs.com/wlzy/p/9688221.html

Unity各平台内置宏定义

属性 方法 UNITY_EDITOR #define directive for calling Unity Editor scripts from your game code. UNITY_EDITOR_WIN #define directive for Editor code on Windows. UNITY_EDITOR_OSX #define directive for Editor code on Mac OS X. UNITY_STANDALONE #define directi

Shader预处理宏、内置状态变量、多版本编译等

预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D 9 SHADER_API_XBOX360 - Xbox 360 SHADER_API_PS3 - PlayStation 3 SHADER_API_D3D11 - desktop Direct3D 11 SHADER_API_GLES - OpenGL ES 2.0 (desktop or mobile), u

宏定义与内置函数的比较

/* time:20200415 where:gfdx man:g-7.net */ #include<iostream> using namespace std; #define doub(x)x*2 int main() { for (int i = 1; i <= 4; i++) { cout << i << '\t'<< "doubled is" << '\t'<<double(i) <<