返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言超全面define预处理指令的使用说明
  • 565
分享到

C语言超全面define预处理指令的使用说明

2024-04-02 19:04:59 565人浏览 独家记忆
摘要

目录前言#define 定义宏(无参)#define 定义宏函数宏的更多规则特性宏的缺点常见预处理指令前言 C语言中源代码到可执行文件的第一阶段,也就是预处理阶段,会检查源文件中的预

前言

C语言中源代码到可执行文件的第一阶段,也就是预处理阶段,会检查源文件中的预处理指令语句和宏定义,并对源代码进行相应的替换,预处理过程还会删除程序中的注释和多余的空白符号。

预处理指令是以#开头的代码行,#必须是该行除了空白符外的第一个字符,#后是指令关键字,在#和指令关键字之间允许存在若干个空白字符,define是宏定义命令。在C语言程序中允许用一个标识符来表示一个字符串,称为“宏”,“宏”又分为有参和无参,有参又称为“宏函数”,被定义为“宏”的标识符称为“宏名”。

#define 定义宏(无参)

语法规定:

#define name stuff
name:标识符名\宏名
stuff:可以是关键字、常量、关键字、标识符、标点符号、运算符,表达式

在预处理阶段,编译器会在程序中使用#define定义的标识符替换成stuff,可以通过预处理生成的.i文件查看效果。

//stuff是数值常量
#define NUM 10

//stuff是关键字
#define reg reGISter

//stuff是标点符号
#define GREATER_THAN >

//stuff的更多表达方式
#define do_forever for(;;)
//若定义的stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个\(续行符)
#define DBBUG_PRINT printf("file:%s\tline:%d\t \
                    date:%s\ttime:%s\n",\
                    __FILE__,__LINE__,\
                    __DATE__,__TIME__)

总结:#define定义的name(宏名),在预编译阶段会将所有的宏名替换成stuff,stuff内容被替换到源代码中。称为“宏代换”或“宏展开”。

注意:define定义的标识符的时候,后面加上“;”会将“;”认为是stuff中的内容。

#define 定义宏函数

宏函数的申明方式:#define name(parament-list) stuff
parament-list:参数列表

 注意:参数列表的左括号必须与name紧邻,如果两者之间有空白存在,参数列表就会被解释为stuff的部分。

宏函数存在的问题1

#include <stdio.h>
#define SQUARE(x) x*x//定义一个宏函数求平方
int main()
{
    int x = SQUARE(3+1);//替换后x的计算结果是多少?答案是:7
 
}

 为什么呢?

在给宏函数传参时,如果传递的是一个表达式,不会先计算表达式的结果再进行传参,而是直接将表达式整体作为参数传递。

那么如何防止发生这样的情况呢?+()

 宏函数存在的问题2

#include <stdio.h>
#define SUM(x,y) (x)+(y)
int main()
{
    int a = 10;
    int b = 5;
    int c = SUM(a,b)*2;//替换后c的结果为20,why
    return 0;
}

我们看看替换后的结果

 这又该如何解决呢?

 总结:在对数值表达式进行求值的宏定义应该用这两种方式加上括号,避免在使用宏参数的操作符或邻近操作符之间不可预料的相互作用。 

 #define替换规则:

1.在使用宏函数时,首先对参数进行检查,看看参数中是否包含任何#define定义的标识符,如果有,他们首先被替换。

2.替换的内容被插入到源文件原来的位置。对于宏函数,参数名被他们的值替换

宏的更多规则特性

1.宏名一般用大写

2.使用宏可提高程序的通用性和易读性,便于修改。

3.宏定义末尾不加分号

4.宏定义写在函数的大括号外面,作用域为其后的程序,通常放在开头

5.宏函数不可递归

6.宏定义不分配内存,变量定义分配内存

7.字符串" "中永远不包含宏

8.宏定义不存在类型问题,他的参数也没有类型

宏的缺点

1.宏不能调试

2.宏由于与类型无关,不够严谨

3.宏可能带来运算符优先级的问题,导致容易出错

常见预处理指令

#define:宏定义

#undef:撤销已经定义过的宏名

#include:将另一个源文件嵌入到#include源文件中

#if~#endif:如果#if后面的常量表达式为真,则编译#if~#endif之间的代码,如果为假,跳过这些代码不编译。

#if~#elif~#else~#endif:和if~else if~else类似,可以建立更分支。

#ifdef symbol~endif:判断是否被定义,定义了编译他们之间内容

#ifndef symbol~endif:判断是否被定义,没定义编译他们之间的内容

#line:改变当前行数和文件名称,是在编译程序中预先定义的标识符命令的基本形式:#line number["filename"]

#error:编译程序时,只要遇到#error就会生成一个编译错误的提示信息,并停止编译。

#pragma: 可以设定编译程序完成一些特点的动作(可以通过编译程序的菜单中设置),可以向编译程序传送各种指令。

到此这篇关于C语言超全面define预处理指令的使用说明的文章就介绍到这了,更多相关C语言define内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言超全面define预处理指令的使用说明

本文链接: https://lsjlt.com/news/146910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言超全面define预处理指令的使用说明
    目录前言#define 定义宏(无参)#define 定义宏函数宏的更多规则特性宏的缺点常见预处理指令前言 C语言中源代码到可执行文件的第一阶段,也就是预处理阶段,会检查源文件中的预...
    99+
    2024-04-02
  • C语言中的预处理命令怎么使用
    这篇“C语言中的预处理命令怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的预处理命令怎么使用”文章吧。一、预...
    99+
    2023-07-04
  • R语言 data.frame()命令的使用说明
    同expand.grid() 一样,data.frame() 也是一个生产数据框的命令 不同的是,两者产生的结果,要求不一样 data.frame() 的命令,如 data.fr...
    99+
    2024-04-02
  • C#预处理器指令的用法
    目录1,预处理器指令的概念2,预处理器指令的定义与使用2.1,可为空上下文2.2,定义符号2.3,条件编译2.4,定义区域2.5,错误和警告信息2.6,杂注3,预处理器指令的用途结语...
    99+
    2023-05-16
    C# 预处理器指令
  • 详解C语言中的预处理命令
    目录一、预处理命令简介二、宏定义1、宏定义的定义2、宏定义的使用3、宏定义的终止——#undef三、文件包含初学C语言的时候,我们会在开头写下一句话,#inc...
    99+
    2022-12-08
    C语言预处理命令 C语言预处理
  • c语言的预处理命令有哪些
    C语言的预处理命令有以下几种:1. #include:用于包含头文件。2. #define:用于定义宏。3. #ifdef、#ifn...
    99+
    2023-08-18
    c语言
  • C语言简明讲解预编译的使用
    目录小复习1、内置符号2、自定义符号3、自定义宏4、条件编译小复习 预处理,预编译是编译的第一步。 会有三件基本的事情发生: 引入#include去除注释修改#define 1、内置...
    99+
    2024-04-02
  • C语言之预处理命令的深入讲解
    c提供的预处理功能有: 宏定义 文件包含 条件编译 为了与其她c语句区分,命令经常以符号“#”开头。 宏定义 #define 标识符 字符串 可以避免反复输入字符串...
    99+
    2024-04-02
  • C语言之预处理命令的示例分析
    这篇文章主要介绍C语言之预处理命令的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!c提供的预处理功能有:宏定义文件包含条件编译为了与其她c语句区分,命令经常以符号“#”开头。宏定义#define 标识符 字符...
    99+
    2023-06-14
  • C语言超全面讲解函数的使用方法上
    目录一、函数的分类1.库函数2.自定义函数3.库函数的分类二、函数调用1.传值调用2.传址调用三、函数的声明四、函数定义 五、函数的参数1.形式参数(形参)2.实际参数(实...
    99+
    2024-04-02
  • C语言超全面讲解函数的使用方法下
    目录一、函数的嵌套调用二、函数的链式访问三、函数递归递归的优缺点必要条件使用场景函数递归的细节说明 举例说明对两个必要条件的理解四、递归练习C语言超全面讲解函数的使用方法上...
    99+
    2024-04-02
  • C语言简明介绍指针的使用
    目录1. 指针类型2. 野指针3. 指针的运算3.1 指针+-整数3.2指针-指针3.3 指针的关系运算4. 指针数组1. 指针类型 指针以字节为单位; 指针类型决定了解引用时能访问...
    99+
    2024-04-02
  • C语言预处理器使用方法讲解
    目录预处理器实例预定义宏预处理器运算符参数化的宏C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器...
    99+
    2022-12-30
    C语言预处理器 C语言预处理
  • .net 预处理指令符的使用详解
    目录什么是预处理指令符?预处理指令符的使用自定义指令符使用Visual Studio快速定义指令符定义指令符区域什么是预处理指令符? 当C#编译器找到一条预处理指令#if,最后找到一...
    99+
    2024-04-02
  • c语言预处理的作用是什么
    C语言预处理器是C语言编译器的一部分,它主要用于对源代码进行预处理,其作用包括: 宏定义和宏替换:预处理器可以定义宏,并在源代码...
    99+
    2024-03-12
    c语言
  • C语言宏定义与预处理命令怎么应用
    这篇文章主要介绍了C语言宏定义与预处理命令怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言宏定义与预处理命令怎么应用文章都会有所收获,下面我们一起来看看吧。宏定义与预处理命令预处理阶段:处理宏定义与...
    99+
    2023-07-02
  • C语言超详细讲解指针的使用
    目录指针概述自身类型指向类型代码例子数值型指针字符型指针单字符字符数组字符串型指针字符数组总结指针概述 C语言中指针也可以认为是一种类型,不同于数值型和字符型的类型。推演过去指针变量...
    99+
    2024-04-02
  • C#中可用的预处理器指令有哪些
    今天小编给大家分享一下C#中可用的预处理器指令有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C# 预处理器指令列表下表...
    99+
    2023-06-17
  • C语言利用面试真题理解指针的使用
    目录前言笔试题一笔试题二笔试题三笔试题四笔试题五笔试题六笔试题七笔试题八前言 大家好~我又来了,今天给大家带来的是指针的几道笔试题,希望能够加强大家对指针知识的把握,指针就应该这样学...
    99+
    2022-11-13
    C语言 指针 C语言 面试 指针
  • C语言详细分析宏定义与预处理命令的应用
    目录宏定义与预处理命令预处理命令 - 宏定义定义符号常量定义傻瓜表达式定义代码段预定义的宏函数 VS 宏定义预处理命令 - 条件式编译示例宏定义与预处理命令 预处理阶段:处理宏定义与...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作