广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言预编译的方法
  • 392
分享到

C语言预编译的方法

2023-06-30 10:06:29 392人浏览 安东尼
摘要

本篇内容介绍了“C语言预编译的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、预定义符号预定义符号是系统本身定义的:FILE 

本篇内容介绍了“C语言预编译的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、预定义符号

预定义符号是系统本身定义的:

  • FILE 进行编译的源文件的位置

  • LINE 文件当前的行号

  • DATE 文件被编译的日期

  • TIME 文件被编译的时间

  • STDC 如果编译器遵循 ASNSI C,其值为1,否者未定义

C语言预编译的方法

二、#define 定义标识符

语法:#define name stuff (用stuff替换name)

#define MAX 100   #define STR "hehe"int main(){int max = MAX;printf("%d\n", max);  //输出100printf("%s\n",STR);   //输出 hehereturn 0;}

三、#define 定义宏

  • #define 机制包括了一个机制,允许把参数替换到文本中,这种实现通常称为或者宏定义

  • 宏的申明方式:#define name(parament-list) stuff 其中的parament-list是一个由逗号隔开的符号表,他们可能出现在stuff中。

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

#define SQUARE(X) X*Xint main(){int ret = SQUARE(5);printf("%d\n",ret); //输出25return 0;}

上面的宏定义代码存在一定的问题: 如果我们换一个参数(将5换成5+1)输出的不是36而是11为什呢?

#define SQUARE(X) X*Xint main(){int ret = SQUARE(5+1);//替换之后就是(5+1*5+1 = 11)printf("%d\n",ret);//输出11return 0;}

没加括号
因此,用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或临近操作符之间不可预料的相互作用。

正确的代码:

#define SQUARE(X) (X)*(X))int main(){int ret = SQUARE(5+1);printf("%d\n",ret);//输出36return 0;}

四、#define 替换规则:

  • 一, #define NAME “lisa”
    程序中有"NAME",但”“内的东西不会被宏替换。

  • 二,宏定义前面的那个必须是合法的用户标识符

  • 三,宏定义也不是说后面东西随便写,不能把字符串的两个”“拆开。

  • 四: #define NAME “lisa”
    程序中有上面的宏定义,并且,程序里有句:
    NAMELIST这样,不会被替换成"lisa"LIST

  • 五,宏不能出现递归

五、#和## 两个符号(少见)

#的作用:把参数插入到字符串中

如果我们想要实现一个代码:把参数插入到字符串中 用到“#”

C语言预编译的方法

这里参数a,b就插入到了字符串中了
 ##的作用:可以把位于它两边的符号合成一个符号,它允许宏定义冲从分离的文本片段创建标识符。

C语言预编译的方法

图中的三句代码是等价的:

printf(“%d\n”,AGE(lisa,24));
printf(“%d\n”,AGE(lisa##24));
printf(“%d\n”,AGE(lisa24));

六、宏和函数的对比

函数和宏都能实现求两个数的最大值

//函数int Max(int x, int y){return (x > y ? x : y);}//宏#define MAX(X,Y) ((X)>(Y)?(X):(Y))int main(){int a = 10;int b = 20;int max = Max(a, b); //输出20printf("%d\n",max);max = MAX(a, b);printf("%d\n", max); //输出20return 0;}

通过分析上面的代码实现用宏比用函数会更好,有两个原因:

  • 用于调用函数和从函数返回的代码可能比实际执行的这个小型计算工作所需要的时间更多,所以宏比函数在程序的规模和速度方面更胜一筹。

  • 函数的参数必须申明为特定的类型。所以函数只能在类型合适的表达时式上使用。反之宏是与类型无关的。

当然宏相比函数也有劣势的地方:

  • 每次使用宏的时候,一份宏定义的代码将替换插入到程序中。除非宏比较短,否者可能大幅度增加程序的长度。

  • 宏没法调试

  • 宏由于类型无关,也就不够严谨

  • 宏可能会带来运算符优先级的问题,导致程序容易出错。

#define定义宏和函数的对比表格

属性#define定义宏函数
代码长度每次使用时宏代码都会被插入到程序中除了非常小的宏之外,程序的长度会大幅度增长函数的代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一份代码
执行速度更快存在函数的调用和函数的额外开销,所以速度相对慢一些
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否者邻近操作符的优先级可能产生不可预料的结果,所以建议宏在书写的时候多用括号函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。
带有副作用的参数参数可能被替换带宏中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一次,结果更容易控制
参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以适用于任何参数类型函数的参数与类型有关,如果参数的类型不同,就需要不同的函数,即使他们执行任务是不同的
调试和递归宏不方便调试,不能递归函数可以逐语句调试,可以递归

命名约定:把宏名全部大写,函数名不要全部大写。

七、#undef

#undef 指令用于移除一个宏定义

当#undef 移除宏定义,再次使用报错。如图 :

C语言预编译的方法

“C语言预编译的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C语言预编译的方法

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言预编译的方法
    本篇内容介绍了“C语言预编译的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、预定义符号预定义符号是系统本身定义的:FILE ...
    99+
    2023-06-30
  • C语言预编译#define(预处理)
    目录一、预定义符号二、#define 定义标识符三、#define 定义宏四、#define 替换规则:五、#和## 两个符号(少见)六、宏和函数的对比七、#undef一、预定义符号...
    99+
    2022-11-13
  • C语言预编译怎么使用
    这篇文章主要介绍“C语言预编译怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言预编译怎么使用”文章能帮助大家解决问题。1、内置符号这些符号都可以直接使用:__FILE__ &n...
    99+
    2023-06-30
  • C语言程序环境编译的方法
    这篇文章主要介绍“C语言程序环境编译的方法”,在日常操作中,相信很多人在C语言程序环境编译的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言程序环境编译的方法”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-30
  • C语言简明讲解预编译的使用
    目录小复习1、内置符号2、自定义符号3、自定义宏4、条件编译小复习 预处理,预编译是编译的第一步。 会有三件基本的事情发生: 引入#include去除注释修改#define 1、内置...
    99+
    2022-11-13
  • C语言程序的编译与预处理详解
    目录一、程序的编译1、 编译阶段2、链接二、预处理详解1、预定义符号2、#define定义的标识符3、#define定义的宏4、#unef总结一、程序的编译 我们写的源文件(*.c)...
    99+
    2022-11-12
  • C语言预处理预编译命令及宏定义详解
    目录程序翻译环境和执行环境翻译环境:详解编译+链接1. 编译 — 预处理/预编译 test.c ---- test.i2. 编译 — 编译 test.i ---- test.s3. ...
    99+
    2022-11-12
  • C语言程序的编译与预处理实例分析
    本篇内容介绍了“C语言程序的编译与预处理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!程序的翻译环境和执行环境在ANSIC的任何一种...
    99+
    2023-06-30
  • C语言深入探究程序的编译之预处理
    目录1.程序的翻译环境和执行环境2.详解编译与链接2.1翻译环境2.2编译本身也分为几个阶段2.3运行环境3.预处理详解3.1预处理符号3.2#define3.2.1#define定...
    99+
    2022-11-13
  • ubuntu如何编译c语言
    ubuntu编译c语言的示例:使用快捷键ctrl+alt+t调出命令行界面。通过命令“touch”命令创建一个main.c文件。touch main.c输入以下命令编写文件。gedit main.c将你需要执行的c语言代码写进文件中,通过后...
    99+
    2022-10-08
  • C语言编程之预处理过程与define及条件编译
    目录名示常量#define重定义常量在#define中使用参数预处理器粘合剂:##运算符变参宏:… 和_ _ VAG_ARGS_ _宏与函数预处理指令#undef指令从C预处理器的角...
    99+
    2022-11-12
  • C#是编译语言还是解释语言
    本篇内容主要讲解“C#是编译语言还是解释语言”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#是编译语言还是解释语言”吧!“C# Java是解释型语言?Oh my god”“引用vls:C# J...
    99+
    2023-06-17
  • C语言程序的编译与预处理基础定义讲解
    目录程序的翻译环境和执行环境1.翻译环境2.运行环境预处理详解预定义符号#define#define定义宏#define替换规则#和##带副作用的宏参数宏和函数对比命名约定#unde...
    99+
    2022-11-13
  • 怎么编译C语言程序
    这篇文章主要介绍了怎么编译C语言程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么编译C语言程序文章都会有所收获,下面我们一起来看看吧。编译/执行 C 程序实例#include <stdio.h>...
    99+
    2023-06-17
  • 如何将Python编译成C语言
    前言: 文章里用的Python环境是Anaconda3 2019.7这里测试的程序是找出所有1000以内的勾股数。a∈[1, 1000],b∈[1, 1000],...
    99+
    2022-11-13
  • C语言条件编译怎么用
    本文小编为大家详细介绍“C语言条件编译怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言条件编译怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、基本概念条件编译的行为类似于 C 语言中的 if....
    99+
    2023-06-30
  • 怎么将Python编译成C语言
    这篇文章主要为大家展示了“怎么将Python编译成C语言”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么将Python编译成C语言”这篇文章吧。前言:文章里用的Python环境是Anacond...
    99+
    2023-06-29
  • c语言编译有几个阶段
    C语言编译过程一般分为四个阶段:预处理、编译、汇编和链接。1. 预处理(Preprocessing):预处理阶段主要进行宏替换、头文...
    99+
    2023-08-14
    c语言
  • ubuntu怎么编译运行c语言
    要在Ubuntu上编译和运行C语言程序,可以按照以下步骤操作:1. 打开终端:按下Ctrl+Alt+T组合键,或者在应用程序中搜索终...
    99+
    2023-09-08
    c语言 ubuntu
  • C语言 程序的编译系统解析
    目录程序的翻译环境和执行环境编译和链接翻译环境编译的几个阶段预处理编译汇编链接运行环境今天我来补一下C语言篇的程序的编译的一篇文章,也算是有一个结尾了。 程序的翻译环境和执行环境 在...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作