常见预处理

预处理 ——#

预处理功能:宏定义、文件包含、条件编译。

预处理命令
#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)

一、#include——文件包含

第一种----尖括号

#include <stdio.h>

第二种----双引号

#include "stdio.h"

使用尖括号和双引号的区别在于头文件的搜索路径

尖括号:编译器会到系统路径下查找头文件

双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找

二、#ifndef——条件编译

1.作用:

#ifndef 是"if not defined"的简写,是预处理功能当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:

1、防止头文件被重复包含和编译;

2、便于程序的调试和移植;

#ifndef起到的效果是防止一个源文件多次包含同一个头文件

2.应用:

一般把头文件的内容都放在#ifndef和#endif中吧。不管你的这个头文件会不会被多个文件引用,你最好都加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>

......
头文件内容
......

#endif
eg. stdio.h

(标识的明明规则一般是头文件名全大写,前面加下划线,并把文件名中的"."也变成下划线)

#ifndef _STDIO_H
#define _STDIO_H

......
stdio.h文件的内容
......

#endif

3.应用
#ifndef 标识符

#define 标识符

程序段 1

#else

程序段 2

#endif

三、#define ——宏定义

它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。

格式:#define 标识符 字符串

并不是所有情况下#define所定义的字符串都会被替换,有一种特殊情况:被替换的字符串在""内

代码示例:

#include <stdio.h>

#define MX 10   //一般把#define写在所有函数之外
#define C  (4 * 1024)
#define ABS(x)            (((HATA_S32)(x) < 0) ? (-(HATA_S32)(x)) : (HATA_S32)(x))
#define MAX(a, b)         (((a) > (b)) ? (a) : (b))
//宏定义函数
#define CHECK_ERROR(state, error_code) 
if (state)                                  
{                                           
    return error_code;                      
}
//

int main()
{
    #define MN 0
    printf("MX");
    int a, b=MX, c=MN;
    c = MAX(a, b) ;//宏定义表达式
    CHECK_ERROR(c != 10, 0x01);
}

1.定义位置:在某个函数内,还是在所有函数之外(不太建议把#define写在函数内),
2.#define作用域:不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
typedef:如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;如果放在某个函数内,它的作用域就是从它定义开始直到该函数结尾。
不管是typedef还是define,其作用域都不会扩展到别的文件。即使是同一个程序的不同文件,也不能互相使用。
3.内存:#define和声明、定义都不同,宏定义不占内存空间,因为宏在预处理阶段就会被替换掉,到了编译的阶段是没有宏存在的,它在预编译阶段就被处理了
#define(宏定义)----由预处理器来处理

四、#undef

typedef----在编译阶段由编译器处理

上文提到#define的作用域是从它声明开始到文件结尾,#undef就是取消之前的宏定义(也就是#define的标识符)

格式:#undef 标识符(注意:如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令)

#include <stdio.h>

#define MAX 10
int main()
{
    printf("%d", MAX);
#undef MAX
#define    MAX 20
    printf("%d", MAX);
}

五、#if

#if命令要求判断条件为整型常量表达式,也就是说表达式中不能包含变量,而且结果必须是整数;而if后面的表达式没有限制,只要符合语法就行,这是#if和if的一个重要区别。

#include "stdio.h"
#define MAX 10
int main()
{
    printf("MAX = %d\n", MAX);

#if    MAX == 10
    printf("MAX已被定义\n");
#else
    printf("MAX未被定义\n");
    #undef MAX
    #define    MAX 20
#endif


    printf("MAX = %d\n", MAX);

    return 0;
}

六、#ifdef

#ifdef的作用是判断某个宏是否定义,如果该宏已经定义则执行后面的代码,一般使用格式如下

#ifdef 宏名
//程序段1
#else
//程序段2
#endif

它的意思是,如果该宏已被定义过,则对程序段1进行编译,否则对程序段2进行编译(这个和上面的#if一样最后都需要#endif),上述格式也可以不用#else,这一点上和if else相同

代码示例:

#include <stdio.h>

#define MAX 10
int main()
{
#ifdef MAX
    printf("MAX已被定义\n");
#else
    printf("MAX未被定义\n");
    #undef MAX
    #define    MAX 20
#endif


    printf("MAX = %d\n", MAX);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值