编译预处理

1、预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:

#           空指令,无任何效果
#include    包含一个源代码文件
#define     定义宏
#undef      取消已定义的宏
#if         如果给定条件为真,则编译下面代码
#ifdef      如果宏已经定义,则编译下面代码
#ifndef     如果宏没有定义,则编译下面代码
#elif       如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif      结束一个#if……#else条件编译块
#error      停止编译并显示错误信息

2、宏定义
(1)宏
定义常量与命令-避免幻数。

#define MAX 100
#define SIZE 1024
#define LOGIN_SUCCESS 1
#define LOGIN_FAIL 0
【注意】:在宏定义的命名时,尽量能够清晰的表明其用途。

(2)宏定义函数
这里写图片描述

【注意】宏函数与自定义函数的区别?
从以下几个方面讲:
(1)宏函数在预处理阶段处理,而自定义函数在编译阶段处理。
(2)宏函数比较灵活,但会产生一定的副作用,因为宏函数只是傻瓜式的替换,不会进行语法分析。
(3)自定义函数需要分配内存空间、释放等一系列的操作,二宏函数只是替换,因此宏函数的效率相对高一些。
一般将简单的函数或者平凡被调用的函数用宏函数替代。
这里写图片描述

【注意2】
以编译时间换空间–宏函数;
以空间换执行时间–内敛函数(inline);

3、内置宏定义
func(显示函数名)
LINE(显示行号)
TIME(显示时间)
DATE(显示日期)

【注意3】typedef与#define的区别?
(1) 执行时间不同
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
(2)功能不同
typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。
define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
(3)作用域不同
define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。

详细内容参考

4、条件编译指令
#if#endif、/#else、/#elif指令
#ifdef和#ifndef指令

【注意4】#ifndef和#define的作用
防止头文件重复包含导致的重复定义。

这二者主要用于防止重复包含。我们一般在.h头文件前面加上这么一段:

//头文件防止重复包含
//funcA.h
#ifndef FUNCA_H
#define FUNCA_H
//头文件内容
#end if
这样,如果a.h包含了funcA.h,b.h包含了a.h、funcA.h,重复包含,会出现一些type redefination之类的错误。
#if defined等价于#ifdef; #if !defined等价于#ifndef

5、其他预处理命令

#error指令将使编译器显示一条错误信息,然后停止编译。
#line指令改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
#pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。
复制代码
//例10,#line举例
#line   100          //初始化行计数器 
#include<stdio.h>    //行号100
int main()
{
    printf("Hello World!\n");
    printf("%d",__LINE__);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值