C语言中一些不常见的预处理命令

       最近在研究德州仪器(TI)的达芬奇(DaVinci)技术,于是乎又开始读代码的工作了。这是一项浩大的工程,成百上千,或许更多的结构体定义,满篇的预处理与宏定义,眼花缭乱啊奋斗,不得不佩服大公司的开发人员,能够搞出几百兆的开发套件(DVSDK),这都是文本文件累积出来的呀得意

      步入正题,因为该开发套件是针对各种平台的,所以里面的头文件里使用了大量的像 #ifndef、#ifdef、#elif、#else、#endif 这样的预处理命令。并且也有其它一些不常见的,呵呵,有些童鞋可能遇到比较多,我是很少接触到这样的命令 ^_^  。既然出现了,也不能放着不管,索性去查了一下,顺便把其它一些不常见的预处理命令也一并了解了,马上就要找工作了,就当作是复习吧,呵呵。

      1、#error

      #error指令将使编译器显示一条错误信息,然后停止编译。

      语法格式:

      #error message: 编译器遇到此命令是停止编译,并将参数 message 输出。该命令常用于程序调试。下面举个例子:

            #ifndef XXXX
            #error XXXX has not been defined
            #endif

      当程序比较大时,有些宏定义往往是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXXX 时,就可以像上面那样进行编译。这样,如果编译时出现错误 fatal error C1189: #error :  XXXX has not been defined(我这是在VC++6.0中做的实验),表明宏XXXX还没有被定义。

      2、#line

      #line指令可以改变编译器用来指出警告和错误信息的文件号和行号,该命令常用于程序调试。这个可能不好理解,下面举个例子一下就明白了。

      建立一个 main.c 的源文件:

      1     #include <stdio.h>
      2
      3     main()
      4      {
      5          int result = add(5, 4);
      6          printf("result = %d", result);
      7      }

      因为add这个函数没有定义,所以编译肯定是会报错的,下面是编译错误信息:

      --------------------Configuration: pretest - Win32 Debug--------------------
      Compiling...
      main.c
      D:\Program Files\Microsoft Visual Studio\MyProjects\pretest\main.c(5) : warning C4013: 'add' undefined; assuming extern returning int

      注意:上面红色背景的5代表出现错误的是第5行。

      下面,我们修改一下源代码:

      1     #include <stdio.h>                            1
      2     #line 10                                               2
      3     main()                                                10
      4                                                               11
      5          int result = add(5, 4);                  12
      6          printf("result = %d", result);       13
      7                                                               14

      #line 10 表示从它的下一行开始,行号变为10,后面的行号依次累加,如绿色背景所示。

      再次编译,显示的错误行号就变为12了。

      --------------------Configuration: pretest - Win32 Debug--------------------
      Compiling...
      main.c
      D:\Program Files\Microsoft Visual Studio\MyProjects\pretest\main.c(12) : warning C4013: 'add' undefined; assuming extern returning int

      3、#

      出现在宏定义中的 # 运算符把跟在其后的参数转换成一个字符串,例如:  

            #include <stdio.h>

            #define STR(n) "abc"#n

            main()
            {
                 printf("%s\n", STR(DEF));
            }

      程序执行输出:abcDEF

      4、##

      ##运算符用于把参数连接到一起。预处理程序把出现在 ## 两侧的参数合并为一个符号(注意,不一定是字符串,也可能是其它数据类型),看下面的例子:

            #include <stdio.h>

            #define NUM(a, b, c) a##b##c
            #define STR(a, b, c) a##b##c

            main()
            {
                 printf("%d\n", NUM(1, 2, 3));
                 printf("%s\n", STR("ab", "cd", "ef"));
            }

      程序执行输出:

            123
            abcdef

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值