gcc中调试代码常用的宏

2023-05-16

     红色是比较常用的

意义
__FILE__      本文件名
__LINE__本行位于该文件的第几行
__FUNCTION__函数名
__PRETTY_FUNCTION__c语言中和同上,C++中稍有区别

__VA_ARGS__

格式化输出

__VA_ARGS__的使用例子:

#define ct_verbose(level, chfr, ...)  ct_log("", 0, "", level , NULL, chfr, __VA_ARGS__)

其他的更简单,就不写了。

  在标准C以及各中编译器中定义了一些对象宏, 这些宏的名称以"__"开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义。

      在ANSI C标准中定义了__FILE__,__LINE__,__DATA__,__TIME__,__STDC__等标准的预定义宏。GCC对其进行扩展,也定义了多个预定义宏。

 

      概括起来GCC中可使用的预定义宏涵盖了如下几方面的信息:
      1、宿主的信息:GNU的版本,编译器的版本,类型的相关信息,字节序信息等。
      2、编译动作的信息:编译的日期、时间;编译时是否进行了时间或空间上的优化;定义的inline是否被编译器执行等。
      3、文件的信息:文件名称、函数名称、行数信息、文件最后修改时间等等。
      4、计数信息:__COUNTER__,__INCLUDE_LEVEL__等。

 

      下面是一些常见的预定义宏的使用方法。

 

1、__FILE__,__LINE__,FUNCTION__
      这是最常用到的预定义宏的组合,表示文件名、行数和函数名,用于程序运行期异常的跟踪。如:

       

[cpp:collapse]  + expand source view plain copy

     

          运行./tset时:
          line 9 in main.c(main) : two argvs are needed
          Aborted

         

          运行./test kkk时:
          line 12 in func.c(func) : file not exist
          Aborted

     

          运行./test test时成功。

          可见通过使用__FILE__,__LINE__,FUNCTION__宏,可以帮助我们精确的定位出现异常的文件、函数和行数。

     

    下面是glib把调试信息定义成宏:

     #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
    #  define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
    #else
    #  define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__)
    #endif

     

    2、__BASE_FILE__

          这个宏是和__FILE__相对应的,表示主输入文件的名字,对于源文件而言__FILE__和__BASE_FILE__是一样的;对于头文件二者才可能不同。比如在上个例子中,__LINE__这个宏是在myassert.h文件中定义的,被main.c和func.c包含之后__FILE__的值
    分别变成了main.c和func.c。但是当我们希望知道MyAssert这个宏具体实在哪个文件(实际上是myassert.h)中定义的话,就需要用到__BASE_FILE__。
         下面的例子可以帮助加深理解:

          

    [cpp:collapse]  + expand source view plain copy
        

       

             gcc main.c &&./a.out 得到:

             basefile.h
             main.c

       

       3、__DATE__,__TIME__
             用于得到最后一次编译的日期和时间(字符串形式):

            

      [cpp:collapse]  + expand source view plain copy

         

               gcc main.c &&./a.out 得到:
               DATE : Jan 27 2011
               TIME : 17:12:55

         

        4、__TIMESTAMP__
               和__TIME__的格式相同。同于得到本文件最后一次被修改的时间。

         

        5、__GNUC__、__GNUC_MINOR__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__
               用于得到GNU版本:

              

        [cpp:collapse]  + expand source view plain copy

           

          6、__VERSION__
               用于得到编译器的版本      

               

          [cpp:collapse]  + expand source view plain copy

             

                  gcc main.c && ./a.out得到:

                  Version : 4.1.2 (Gentoo 4.1.2 p1.0.2)
                  可以和gcc -v相互验证

             

            7、__COUNTER__
                  自身计数器,用于记录以前编译过程中出现的__COUNTER__的次数,从0开始计数。常用于构造一系列的变量名称,函数名称等。如:

                 

            [cpp:collapse]  + expand source view plain copy

               

                    gcc main.c &&a.out得到结果:
                    0
                    1
                    这里使用__COUNTER__构造了两个变量:var0,var1。

              8、__INCLUDE_LEVEL__
                    用于表示文件被包含的计数,从0开始递增,常作为递归包含的限制条件。如:

                   

              [cpp:collapse]  + expand source view plain copy

                 

                      gcc main.c && ./a.out,得到结果:
                      1 2 3 4 5 6 7 8 9
                      在这个例子中文件rep.h自包含了9次,执行了9次REP(BLAH)。

                 

                      实际上,__INCLUDE_LEVEL__最多的是和#include __FILE__组合使用,用于表示一个递归。如:

                     

                [cpp:collapse]  + expand source view plain copy

                   

                        gcc main.c && ./a.out得到结果:
                        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/Standard-Predefined-Macros.html#Standard-Predefined-Macros
                  http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros


                  本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

                  gcc中调试代码常用的宏 的相关文章

                  随机推荐

                  • 我的2014作的一手好死,2015求轻虐

                    真的好想上来开头就写 新的一年 xff0c 全新的自己 xff0c 但是这样自欺欺人的话我还是别说了 xff0c 省得一大批损友又来吐嘈我 2015年希望找到自己的另一半这样的话我也不想再提了 xff0c 因为这样写了两年 依旧单身 xff
                  • 织梦后台登陆不上提示验证码不正确

                    1 密码明明正确的 xff0c 却无法登陆后台管理 解答 xff1a 此外 xff0c 不管是新人 xff0c 还是phper xff0c 都要注意的是 xff1a 用户名和密码只能由 a z A Z 64 这些字符组成 xff0c 不能是
                  • 复选框单选框与文字对齐问题的研究与解决

                    原文地址 xff1a http www zhangxinxu com wordpress p 61 56 前言 目前中文网站上面的文字 xff0c 就我的个人感觉而言 xff0c 绝大多数网站的主流文字大小为12px xff0c 因为在目前
                  • iOS系统及微信中不支持audio自动播放问题

                    span class hljs tag lt span class hljs title script span span class hljs attribute src span 61 span class hljs value 34
                  • 模拟复选框

                    span class hljs doctype lt DOCTYPE html gt span span class hljs tag lt span class hljs title html span gt span span clas
                  • 【SLAM综述】A Survey on Deep Learning for Localization and Mapping

                    A Survey on Deep Learning for Localization and Mapping Towards the Age of Spatial Machine Intelligence
                  • 树莓派设置开机执行, 指定用户和用户组

                    Linux 开机执行有几种方式 一种是设置成系统服务 随着系统加载而启动 另一种是修改 etc rc local 脚本 在 exit 之前加入需要执行的语句 后者默认是以 root 用户执行 非 root 执行可以这么写 su yourna
                  • 验证码刷新

                    lt label span class hljs keyword class span 61 span class hljs string 34 focusa 34 span gt 看不清 xff1f lt a href 61 span c
                  • 如何从数据库调出数据显示到页面PHP+Mysql+Html(简单实例)

                    首先显示一下数据库的数据 页面信息 lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 Transitional EN 34 34 http www w3 org TR xhtml1 DTD xhtml1
                  • PHP+MYSQL+HTML 学生成绩查询

                    首先创建一个数据库名为 xscj xff0c 表信息如下 xff1a 页面信息为 xff1a lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 Transitional EN 34 34 http ww
                  • php试题与答案(一)

                    1 xff0e mysql connect 与 64 mysql connect 的区别是 B A 64 mysql connect 不会忽略错误 将错误显示到客户端 B mysql connect 不会忽略错误 将错误显示到客户端 C 没
                  • php试题与答案(二)

                    37 xff0e 在str replace 1 2 3 函数中1 2 3 所代表的名称是 B A 34 取代字符串 xff02 xff0c xff02 被取代字符串 xff02 xff0c xff02 来源字符串 xff02 B xff02
                  • PHP实现上一页下一页翻页代码实例

                    lt php 1 xff0c 将数据库的所有记录查询出来 xff0c 然后再一页一页的显示 link 61 mysql connect 39 localhost 39 39 root 39 39 123 39 mysql select db
                  • QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法

                    QT4 升级到 QT5 改动 PC部分 xff1a 改 QTDIR 变量 在工程根目录下找到 user 文件 如 InnoTabPlugin vcxproj user 修改指向你的 QT5 根目录 xff1a lt PropertyGrou
                  • c++中ifstream一次读取整个文件

                    c 43 43 中一次读取整个文件的内容的方法 xff1a 1 读取至char 的情况 cpp view plain copy std ifstream t int length t open 34 file txt 34 open inp
                  • webkit/chromuim/CEF3介绍

                    一 浏览器主要构成 浏览器的主要构成High Level Structure 浏览器的主要组件包括 xff1a 1 用户界面 xff0d 包括地址栏 后退 前进按钮 书签目录等 xff0c 也就是你所看到的除了用来显示你所请求页面的主窗口之
                  • python多文件使用同一个全局变量的定义和使用方法

                    Python是一种面向对象的开发语言 xff0c 在函数中使用全局变量 xff0c 一般应作全局变量说明 xff0c 只有在函数内经过说明的全局变量才能使用 xff0c 下面介绍下Python全局变量有关问题 应该尽量避免使用Python全
                  • D3VO 2020CVPR论文阅读

                    Deep Depth Deep Pose and Deep Uncertainty for Monocular Visual Odometry 论文链接 摘要 xff1a 提出的D3VO单目视觉里程计框架从三个层面上利用了深度学习网络 xf
                  • python在windows下获取cpu、硬盘、bios、主板序列号

                    此处使用的是wmi库 xff0c 可以去google里面搜索 python wmi import os sys import time import wmi zlib def get cpu info tmpdict 61 tmpdict
                  • gcc中调试代码常用的宏

                    红色是比较常用的 宏 意义 FILE 本文件名 LINE 本行位于该文件的第几行 FUNCTION 函数名 PRETTY FUNCTION c语言中和同上 xff0c C 43 43 中稍有区别 VA ARGS 格式化输出 VA ARGS