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__);
    
}

posted @ 2013-01-15 09:21  aswater  阅读(720)  评论(0)    收藏  举报