您的位置:首页 > 编程语言 > C语言/C++

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

2011-07-29 15:12 916 查看
最近在研究德州仪器(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: