栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 

#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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873251.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号