热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言三)预处理指令

一、预处理指令1.定义C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,如:#include,产生一个新的源程序,这个过程称为“编译预处理”,之后再进行通常的编译

一、预处理指令

1.定义

C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,如:#include,产生一个新的源程序,这个过程称为“编译预处理”,之后再进行通常的编译工作。

2.作用范围

预处理指令可以出现在程序的任意位置,它的作用范围是从它出现的位置到文件末尾。习惯上,我们把预处理指令写在源程序开头。

3.类型

C语言提供了预处理指令主要有:宏定义、文件包含和条件编译。


二、不带参数的宏定义

1.一般形式

#define 宏名 字符串

如:#define A 10;

// 源程序中所有的宏名PI在编译预处理的时候都会被3.14所代替
#define PI 3.14
// 根据圆的半径计radius算周长
float girth(float radius) {
    return 2 * PI *radius;
}
int main ()
{
    float g = girth(2);
    printf("周长为:%f", g);
    return 0;
}


2.作用

在编译预处理的时候,将源程序中所有“宏名”替换成右边的字符串,常用来定义常量。

3.注意

1)宏名一般用大写字母,以便和变量名进行区别。

2)对程序中双引号括起来的字符串内的字符,不能进行宏的替换操作。

#define R 10
int main ()
{
    char *s = "Radio"; //这里有R,但是不会替换
    return 0;
}

3)在进行宏的替换操作时,不做语法的检查,只是简单的替换操作而已。只有在替换完后的下一步编译操作,才会进行语法检查。因此,如果有错误,也只会在编译的时候产生。

4)宏名的有效范围默认是从定义位置到文件末尾,如果想终止的话,可以使用“#undef 宏名“,这样,宏名的有效范围就缩减至终止操作的位置。

5)定义宏时,可以使用已经定义过的宏名。

#define R  3.0
#define PI 3.14
#define L  2*PI*R
#define S  PI*R*R

三、带参数的宏定义

1.一般形式

#define 宏名(参数列表) 字符串

2.作用

在编译预处理的时候,将源程序中的宏名替换成字符串,并将字符串中的参数用源程序中的宏名的实际数值代替。

3.注意

1)宏名和参数列表之间不能有空格。

2)定义宏时,参数列表有"()"括起来,字符串的参数也用"()"括起来

#include 
#define D(a) 2*a
int main ()
{
    int b = D(3+4);
    
    printf("%d", b);
    return 0;
}
//2*3+4
//输出结果:10
#include 
#define D(a) 2*(a)
int main ()
{
    int b = D(3+4);
    
    printf("%d", b);
    return 0;
}
//2*(3+4)
//输出结果:14

3)计算结果也用”()“括起来

#include 
#define Pow(a) (a) * (a)
int main(int argc, const char * argv[]) {
    int b = Pow(10) / Pow(2);
    
    printf("%d", b);
    return 0;
}
//10*10/2*2=100
//输出结果:100
#include 
#define Pow(a) ((a) * (a))
int main(int argc, const char * argv[]) {
    int b = Pow(10) / Pow(2);
    
    printf("%d", b);
    return 0;
}
//(10*10)/(2*2)=25
//输出结果:25


4.宏与函数的区别

虽然带参数的宏定义和函数十分相似,但是还是有本质的区别:

1)宏定义不涉及存储空间的分配、参数类型分配、参数传递、返回值的问题。

2)函数在程序运行时执行,而宏替换在编译预处理时执行。所以带参数的宏比函数效率更高。
















C语言三)预处理指令


推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
author-avatar
廖汉林1026_843
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有