1:
#if(条件满足)
执行代码1
#else
执行代码2
#endif
例1:
#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,
//每个头文件的标识符都不应相同。 起标识符的常见方法是若头文件名为"abc.h" ,则标识为"abc_h"
#define XXX
真正的内容,如函数声明之类
#endif
例2:
#define MY_PRINTF_SIMPLE
#if defined(MY_PRINTF_SIMPLE)
void printf(*str) // 向终端简单地输出一个字符串
{
...
}
#elif defined(MY_PRINTF_STANDARD)
int printf(char* fmt, char* args, ...)
{
...
}
#endif
2:
#define指令
第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;
第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
第三种是定义"函数",如#define max(a, b) ((a)>(b)?(a):(b)) 则以后使用 max(x,y) 就可以得到x和y中较大的数
但 max(a++, b)时,a++会被执行多少次取决于a和b的大小。
3:
#include 指令
用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是头文件。
注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。
#include_next 指令
头文件的搜索路径一次为A,B,C,D,E. #include_next所在的当前头文件位于B目录, 那么#include_next使得预处理器从C,D,E目录来搜索#include_next所指定的头文件.
4:
#warning, #error
#warning, #error分别用于在编译时显示警告和错误信息, 格式如下:
#warning tokens
#error tokens
例:#warning "some warning"
注意, #error和#warning后的tokens要用""引用起来!
5:
#pragma用编译器用来添加新的预处理功能或者显示一些编译信息. #pragma的格式是各编译器特定的
6:#line
命令#line改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
__LINE__、 __FILE__ 意思分别为 输出当前代码所在行、所在文件 命令的基本形式如下: # line number["filename"] 其中的数字为任何正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前 行号,文件名为源文件的名字。命令# line主要用于调试及其它特殊应用。 例如,下面说明行计数从100开始;printf() 语句显示数102,因为它是语句#line 100后的第3行。 #line 100 /* 初始化行计数器* / main ( ) /* 行号100 */ { /* 行号101 */ printf("%d/n"_LINE_) ; /* 行号102 */ }
例:
printf("line: %d, file: %s/n", __LINE__, __FILE__);
#line 100 "haha"
printf("line: %d, file: %s/n", __LINE__, __FILE__);
printf("line: %d, file: %s/n", __LINE__, __FILE__);
显示:
line: 34, file: 1.c
line: 100, file: haha
line: 101, file: haha
7:
#ifdef, #ifndef, defined().
#ifdef, #ifndef, defined用来测试某个宏是否被定义
#ifdef name 或 #ifndef name
它们经常用于避免头文件的重复引用:
#ifndef __FILE_H__
#define __FILE_H__
#include "file.h"
#endif
defined(name): 若宏被定义,则返回1, 否则返回0.
它与#if, #elif, #else结合使用来判断宏是否被定义, 乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef. defined用于在一条判断语句中声明多个判别条件:
#if defined(VAX) && defined(UNIX) && !defined(DEBUG)
和#if, #elif, #else不同, #indef, #ifndef, defined测试的宏可以是对象宏, 也可以是函数宏。
8:
# 出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。
## 运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。
例:
#define PASTE(n) "adhfkj"#n
void main()
{
printf("%s/n",PASTE(15));
}
输出为:adhfkj15
#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c
void main()
{
printf("%d/n",NUM(1,2,3));
printf("%s/n",STR("aa","bb","cc"));
}
输出为:
123
aabbcc