c语言中的宏定义和预处理

我们先来看一下ANSI标准定义的C语言预处理指令

预处理意义
#define宏定义
#undef撤销已定义的宏定义
#include使编译程序将另一个源文件嵌入到带有#include的源文件中
#if#if后面的条件为True则编译他与#endif之间的代码,否则跳过这部分代码
#else与#if配合,类似于语法中的else
#elif与#if配合,类似于语法中的else if
#endif结束#if
#ifdef如果有定义就编译下面的语句
#ifndef如果没有定义就编译下面的语句
#line改变当前行数和文件名称
#error遇到#error就会生成编译错误信息
#pragma为实现时定义的命令,它允许向编译程序传送各种指令

另外 ANSI 标准 C 还定义了如下几个宏:

_LINE_ 表示正在编译的文件的行号

_FILE_表示正在编译的文件的名字

_DATE_ 表示编译时刻的日期字符串,例如: “25 Dec 2007”

_TIME_ 表示编译时刻的时间字符串,例如: “12:30:55”

_STDC_ 判断该文件是不是定义成标准 C 程序

注意:宏名的书写由标识符与两边各二条下划线构成

一、#define

\ 在宏定义中是作为接续符的,这一行写不下可以用接续符

#define PI 3.1412926535

#define max(x,y)\
(x)>(y)?(x):(y)

这里我们的max定义中x和y为什么要加括号?假设我们不加括号我们展开以后的样子,好像没问题,我们要是定义一个乘法呢,是不是就出问题了。

// x=10+1
// y=10-1
max(x,y) => 10+1>10-1?10+1:10-1

二、#undef

#define PI 3.1412926535
    程序。。。
#undef PI
	// 下面的程序就没法用PI了

三、条件编译

// 第一种形式:
#ifdef 标识符
    程序段 1
#else
    程序段 2
#endif


// 第二种形式:
#ifndef 标识符
    程序段 1
#else
    程序段 2
#endif


// 第三种形式:
#if 常量表达式
    程序段 1
#else 
    程序段 2
#endif

我们在程序头文件中经常可以看到这种定义,翻译一下就是没有定义这个宏的话就定义这个宏编译程序,要是定义了这个宏的话就结束编译,这样写的目的就是防止这个程序被编译已经但是在编译其他文件时再次返回编译这个文件。

#ifndef UNTITLED_FILE_H
#define UNTITLED_FILE_H
	程序
#endif //UNTITLED_FILE_H

四、#include

文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编 译,结果将生成一个目标文件。C语言提供#include 命令来实现文件包含的操作,它实际是 宏替换的延伸,有两种格式

#include <filename>

#include "filename"

<>会先从系统规定的路径中寻找这个文件,例如UNIX系统下在“/usr/include”

""会先从当前文件中查找

五、#error

#error error-message

编译程序时,只要遇到 #error 就会生成一个编译错误提 示消息,并停止编译。error-message并不需要加双引号

六、#line

#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符 命令的基本形式如下:

#line number["filename"]

也不知道有什么用。。。。据说的作用

编译器对 C 源码编译过程中会产生一些中间文件,通过这条指令, 可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析

七、#pragma

7.1、#pragma message

它能够在编译信息输出窗口中输出相应的信息

#pragma message(“消息文本”)


#define pi 3
#ifdef pi
#pragma message("pi");
#endif
7.2、#pragma once

保证头文件只被编译一次

7.3、#pragma hdrstop

#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间, 所以使用这个选项排除一些头文件。

还有很多关于pragma的指令,在此不在赘述。。。。

八、#运算符

#define SQR(x) printf("The square of x is %d.\n", ((x)*(x)));

调用这个函数的输出为

SQR(8);

The square of x is 64.

但是我们这么写

#define SQR(x) printf("The square of #x is %d.\n", ((x)*(x)));

调用这个函数的输出为

SQR(8);

The square of 8 is 64.

九、##运算符

类似于#运算符

#define XNAME(n) x ## n

NAME(8) 则会被展开为 x8

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值