C语言预处理命令
首先要说明的是C语言的预处理命令是在去掉注释之后才进行的。有时因为注释的存在会对预处理有影响,去注释就是将注释换成空格。
1.预处理指令不是C语言本身的组成部分,更不是C语言语句:他是C语言标准规定的可以出现在C源程序的文件中的命令。这些命令必须以#开头,结尾不加分号,可以放置在源程序的任何位置,其有效范围是从现在位置开始到源程序文件末尾。
2,预处理指令的操作对象是编译器和连接器:用来设置程序编译和链接的各种参数。
3.C语言标准提供了多种预处理命令,包括文件包含、宏定义、条件编译。
1.宏定义:
1.不带参数的宏定义:#define 宏名 [空格] 字符文本
说明:1.宏名按标识符语法取,习惯上用大写字母。2.字符文本可以为C各种符号(包括关键字)
注意:
1.一个宏名不要重复定义多次,否则引用的宏名是最后一次的宏定义。
2.#undef 宏名 命令的作用是取消已有的宏定义。
3.宏定义允许嵌套,即在宏定义的字符文本中可以引用已经定义的宏名,在宏替换时由预处理器层层替换。
例如:
#define WIDTH 80
#define LENGTH (WIDTH+10)
L=WIDTH * a
S=LENGTH * b * WIDTH
2.带参数的宏定义:
#define 宏名(参数列表) 字符文本
引用的形式:
宏名(参数列表)
注意:无论带参数的宏还是不带参数的宏如果想要定义多行可以用 \ 续行
3.#和##预处理运算
C语言标准为预处理命令定义了两个运算符:#和##,他们在预处理时被执行。
#运算符的作用是文本参数"字符串化",即出现在宏定义的字符文本中的#把跟在后面的参数转化为一个C语言常量。
例如:
#define PRINT_MSG1(x) printf(#x"\n")//加点料
PRINT_MSG1(hel loworld)//加点料,工作正常cout不可以
简单来说,#运算符的作用就是对这个参数替换后,再加上双引号括起来,变为参数
##运算符的作用是将两个字符文本连接成一个字符文本,如果其中一个字符文本是宏定义的参数,连接会在参数替换后发生。
例如:
#define SET1(arg) A##arg=arg;
#define SET2(x) Aarg=arg
SET(1)//A1=1;
SET2(1)//Aarg=1;
4.预定义的宏
C语言标准中预先定义了一些有用的符号常量,这些符号常量主要是编译信息,如:
其中是两个'_',__DATE__(字符串类型,MM DD YYYY)和__TIME__(字符串常量 hh:mm:ss)用于指明程序的编译的时间,__FILE__(字符串常量,编译程序文件名)和__LINE__(int,代码的行号)用于调试目地,__STDC__(int ,ANSI C 标志 若为1表明程序兼容ANSI标准)检测系统是否支持C语言标准。
例如:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char * argv[])
{
printf("the programming name is: %s\n",__FILE__);
printf("the complie date is :\t %s\t%s\n",__DATE__,__TIME__);
/*if(__STDC__==1)
{
printf("C ANSI Standard");
}*/
printf("the line is:\t%u\n",__LINE__);
}

浙公网安备 33010602011771号