GCC中常见预定义宏的使用
来源:互联网 发布:淘宝店铺怎么没有收藏 编辑:程序博客网 时间:2024/04/28 10:28
在标准C以及各中编译器中定义了一些对象宏, 这些宏的名称以"__"开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义。 在ANSI C标准中定义了__FILE__,__LINE__,__DATA__,__TIME__,__STDC__等标准的预定义宏。GCC对其进行扩展,也定义了多个预定义宏。 概括起来GCC中可使用的预定义宏涵盖了如下几方面的信息: 下面是一些常见的预定义宏的使用方法。 1、__FILE__,__LINE__,FUNCTION__ 运行./tset时: 运行./test kkk时: 运行./test test时成功。 可见通过使用__FILE__,__LINE__,FUNCTION__宏,可以帮助我们精确的定位出现异常的文件、函数和行数。 2、__BASE_FILE__ 这个宏是和__FILE__相对应的,表示主输入文件的名字,对于源文件而言__FILE__和__BASE_FILE__是一样的;对于头文件二者才可能不同。比如在上个例子中,__LINE__这个宏是在myassert.h文件中定义的,被main.c和func.c包含之后__FILE__的值 gcc main.c &&./a.out 得到: basefile.h 3、__DATE__,__TIME__ gcc main.c &&./a.out 得到: 4、__TIMESTAMP__ 5、__GNUC__、__GNUC_MINOR__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__ 6、__VERSION__ gcc main.c && ./a.out得到: Version : 4.1.2 (Gentoo 4.1.2 p1.0.2) 7、__COUNTER__ gcc main.c &&a.out得到结果: 8、__INCLUDE_LEVEL__ gcc main.c && ./a.out,得到结果: 实际上,__INCLUDE_LEVEL__最多的是和#include __FILE__组合使用,用于表示一个递归。如: gcc main.c && ./a.out得到结果: 参考: http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
1、宿主的信息:GNU的版本,编译器的版本,类型的相关信息,字节序信息等。
2、编译动作的信息:编译的日期、时间;编译时是否进行了时间或空间上的优化;定义的inline是否被编译器执行等。
3、文件的信息:文件名称、函数名称、行数信息、文件最后修改时间等等。
4、计数信息:__COUNTER__,__INCLUDE_LEVEL__等。
这是最常用到的预定义宏的组合,表示文件名、行数和函数名,用于程序运行期异常的跟踪。如:
line 9 in main.c(main) : two argvs are needed
Aborted
line 12 in func.c(func) : file not exist
Aborted
分别变成了main.c和func.c。但是当我们希望知道MyAssert这个宏具体实在哪个文件(实际上是myassert.h)中定义的话,就需要用到__BASE_FILE__。
下面的例子可以帮助加深理解:
main.c
用于得到最后一次编译的日期和时间(字符串形式):
DATE : Jan 27 2011
TIME : 17:12:55
和__TIME__的格式相同。同于得到本文件最后一次被修改的时间。
用于得到GNU版本:
用于得到编译器的版本
可以和gcc -v相互验证
自身计数器,用于记录以前编译过程中出现的__COUNTER__的次数,从0开始计数。常用于构造一系列的变量名称,函数名称等。如:
0
1
这里使用__COUNTER__构造了两个变量:var0,var1。
用于表示文件被包含的计数,从0开始递增,常作为递归包含的限制条件。如:
1 2 3 4 5 6 7 8 9
在这个例子中文件rep.h自包含了9次,执行了9次REP(BLAH)。
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros
- GCC中常见预定义宏的使用
- GCC中常见预定义宏的使用
- GCC中常见预定义宏的使用
- gcc中预定义的宏__GNUC__
- C++ 中常见预定义宏的使用
- 使用gcc在命令行中预定义宏
- gcc预定义宏
- gcc预定义的一些宏
- GCC 上的预定义宏
- 查看gcc预定义的宏
- GCC 的宏预定义列表
- gcc -D:gcc的预定义功能
- 预定义宏的使用
- JSP中“预定义变量”的使用
- 使用 Rx 中预定义的 Subject
- 使用 Rx 中预定义的 Subject
- 查看gcc所定义的所有预定义宏
- 查看gcc预定义宏(predefined macro)的方法
- Linux System Programming:Memory Management
- Wordnik的MongoDB使用经验
- 产看java类是从哪个包加载
- typedef用法详解
- 查找指定节点的所有父子节点的示例函数
- GCC中常见预定义宏的使用
- SQL Server 2005 中的树形数据处理示例
- Intent的常见用法
- Android JNI 使用的数据结构JNINativeMethod详解
- ANSI C标准预定义宏
- KEIL 调试 ADDRESS SPACE OVERFLOW 的问题
- 20年来我得到的20条编程经验
- 保留MYSQL的存储过程注释
- c/c++标准预定义宏