首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序环境和预处理

程序的翻译环境和执行环境 翻译环境:在这个环境中源代码被转换为可执行的机器指令。 执行环境:它用于实际执行代码。 2....接下来,我们具体看过程: 其实笼统地来说,由.c文件到.exe文件,只有两步,编译和链接,但是细分的话,有四步:  所以仔细看图以后,我们可以知道,其实到可执行文件有四步,预处理,编译,汇编,链接...这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static )内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。 4....5.宏替换规则 在程序中扩展 #define 定义符号和宏时,需要涉及几个步骤: 1. 在调用宏时,首先对参数进行检查,看看是否包含任何由 #define 定义的符号。...如果是,就重复上述处理过程。 注意: 1. 宏参数和 #define 定义中可以出现其他 #define 定义的符号。 但是对于宏,不能出现递归。 2.

36130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    程序环境和预处理

    开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。...如果在上述声明之后,你把 SQUARE( 5 ); 置于程序中,预处理器就会用下面这个表达式替换上面的表达式:(宏在预处理的时候,参数也会被替换) 5 * 5 警告: 这个宏存在一个问题:...用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。  2. 更为重要的是函数的参数必须声明为特定的类型。...宏的缺点:当然和函数相比宏也有劣势的地方: 1. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 2. 宏是没法调试的。 3....test.h和test.c使用了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。 如何解决这个问题? 答案:条件编译。

    8410

    程序环境和预处理(1)

    程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。...这个时候程序将使用一个运行时堆栈(stack)(函数栈帧),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。...注意: 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。...原因有二: 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多,所以宏比函数在程序的规模和速度方面更胜一筹。...宏的缺点: 当然和函数相比,宏也有劣势的地方: 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。

    10210

    程序环境和预处理(2)

    例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。...常见的条件编译指令: #if 常量表达式 //… #endif //常量表达式由预处理器求值。...这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。 这样一个源文件被包含10次,那就实际被编译10次。...3.6.2 嵌套文件包含 如果出现这样的场景: comm.h和comm.c是公共模块。 test1.h和test1.c使用了公共模块。 test2.h和test2.c使用了公共模块。...test.h和test.c使用了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。 例子如下: 如何解决这个问题? 答案:条件编译。

    9010

    【C】程序环境和预处理

    本章重点: 程序的翻译环境 程序的执行环境 详解:C语言程序的编译+链接 预定义符号介绍 预处理指令#define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令#include 预处理指令...#undef 条件编译 1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。...2.编译和链接详解 2.1编译的三个阶段 可在Linux环境下,使用gcc编译器对编译期间的每一步进行操作和观察: 预处理 相关指令:gcc -E test.c -o test.i 预处理完成之后就停下来...程序的执行便开始。接着便调用main函数。 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。...宏的优点: 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。 更为重要的是函数的参数必须声明为特定的类型。

    19130

    【C语言】预处理和程序环境

    一、程序的翻译环境和执行环境 我们的代码写完后称为源代码,源代码一般都要经过由编译器和链接器组成的翻译环境中,翻译成二进制的指令(机器指令),再进入执行环境一步步执行代码。...#define的替换规则 在程序中扩展#define定义符号和宏时,需要涉及几个步骤。 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。...替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。...(a):(b)) 这里不用函数的原因: 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。...宏的缺点: 当然和函数相比宏也有劣势的地方: 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 宏是没法调试的。

    10610

    C语言进阶——程序环境和预处理

    可以看出,整个代码运行逻辑是极其严谨和巧妙的。除程序环境外,C/C++在预处理阶段还有各式各样的预处理指令等着我们去发掘,一起来看看吧!...本文主要分为两部分:程序环境讲解和预处理指令详解,其中程序环境需要在Linux环境下用gcc编译器展示,光是环境配置就比较麻烦,因此这部分会偏向于理论知识,不需要去实践,理解性记忆就好了;预处理指令在VS...2.找 main 函数后,开始执行程序 3.程序运行时,会调用一个运行堆栈,存储局部变量和返回地址等信息,主函数在堆栈中 4.程序终止后,有两种情况:正常结束和异常终止 5.推荐优质书籍《程序员的自我修养...(++x) : (++y)); //预编译处理后 走读代码: 1.首先明确为前置++,先+1,再使用 2.把 x 和 y 进行比较,因为是前置++,此时 x = 2  y = 3,显然为假,走后面的语句...推荐了解其他预处理指令 #error #pragma #line  …… ---- 总结   以上就是关于C语言程序环境和预处理的所有内容了,如果你在看完此文后能对C语言代码的运行有一个新的认识,那么本文就值了

    25820

    程序环境和预处理(Program environment and processing)

    ---- 程序环境和预处理:: 1.程序的翻译环境和执行环境 在ANSIC的任何一种实现中,存在两个不同的环境. 第一种是翻译环境,在这个环境中源代码被替换为可执行的机器指令....编译的阶段: 1.两步:编译+链接  2.四步:预处理+编译+汇编+链接  gcc编译过程: 分步编译: 运行环境: 程序执行的过程: 1.程序必须载入内存中,在有操作系统的环境中:一般这个由操作系统完成...存储函数的局部变量和返回地址,程序同时也可以使用静态(static)内存,存储与静态内存中的变量在程序的整个执行过程一直保留他们的值. 4.终止程序,正常终止main函数,也可能是意外终止. 3.预定义符号介绍与...步骤二:替换文本随后被插入到程序中原来文本的位置 对于宏 参数名被他们的值替换 步骤三:最后再次对结果文件进行扫描 看看它是否包含任何由#define定义的符号 如果是就重复上述处理过程 注意:1.宏参数和...  宏在预处理期间就已经完成替换 而函数要在编译期间才执行 而且要开辟大量的函数栈帧 宏的缺点: 1.每次使用宏的时候 一份宏定义的代码插入到程序中 除非宏比较短 否则可能大幅度增加程序的长度 2

    30530

    CC++:程序环境和预处理宏

    编译和链接 一份源代码(比如test.c)需要通过编译,形成一份目标文件,然后与库连接起来,才能形成一份可执行程序test.exe。 编译的过程 编译的过程为:预处理(预编译)、编译、汇编。...预处理:在预处理阶段,源文件包含的头文件会被展开,注释会被去掉,宏会进行替换等等。注意此时还不算是运行了程序,因为还没形成可执行程序。...这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。 4. 终止程序。...如果是,就重复上述处理过程 注意: ①宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。...原因有二: ①用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。 ②更为重要的是函数的参数必须声明为特定的类型。

    64820

    C语言进阶-程序环境和预处理

    目录 前言 程序的翻译环境和执行环境 翻译环境 编译+链接 ​翻译阶段详解 预编译 编译 汇编 链接 运行环境 预处理详解 预定义符号 #define #define 定义标识符 #define 定义宏...头文件包含方式 嵌套文件包含 ---- 前言 ---- 本章主要讲解点: 代码编译链接变成可执行程序程序的过程 掌握学习各种预处理知识 程序的翻译环境和执行环境 ---- 任何一个代码从源文件(.c...,在独立的环境中程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成 调用main函数 执行程序代码:程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址;程序同时也可以使用静态...(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值 终止程序:正常终止main函数,也有可能是意外终止 预处理详解 ---- 预定义符号 内置预定义符号: __FILE__...如果是,就重复上述处理过程 注意: 宏参数和 #defifine 定义中可以出现其他 #define 定义的变量,但是对于宏,不能出现递归 当预处理器搜索 #defifine 定义的符号的时候

    65850

    使用Cookie和Token处理程序保护单页应用程序

    令牌处理程序模式通过将会话和 Cookie 的便利性与访问令牌的强度相结合,解决了多个 SPA 漏洞。...同时使用 Cookie 和 Token 最近为保护用户身份验证免受恶意行为者攻击而开发的一种保护 SPA 的方法是令牌处理程序模式,该模式将网站 Cookie 安全性和访问令牌合并。...通过实施将身份验证从浏览器中移除并利用使用同站点 Cookie 和令牌的 BFF(后端到前端)配置的令牌处理程序架构,组织能够从 SPA 的轻量级方面中获益,而不会牺牲安全性。...令牌处理程序模式的一个主要优势是它将 API 访问与网站问题分离,以便组织可以体验 SPA 的全部优势。...BFF 架构解决方案 令牌处理程序模式通过提供一种方法来利用网站和应用程序安全性的最佳方面,将会话和 Cookie 的便利性与访问令牌的强度相结合,从而解决了多个 SPA 漏洞。

    14710

    Android开发 - 处理 null 和 预防空指针异常(NullPointerException) 的一些经验

    概述: 在实际编码中总是会遇到 空指针异常 ,本文总结了一些处理空指针的个人经验。 原则: 尽早的检查,尽早的失败。...比如: 通过intent传参到新的目标 activity,而且一定需要这个参数,那么在新的目标activity中 onCreate方法中 判断中这个参数,如果null,直接抛出空指针异常让程序崩溃。...或者在 一个普通的方法中,一个 参数必须不能为null ,那么我们在这个方法的第一行就做出判断,如果参数为null,抛出空指针异常。...var.equals("good") 7.将某个对象 toString时,比如: String.valueOf(obj) 优于 obj.toString() 8.使用注解 @NonNull 和...[caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理

    2.3K00

    预处理、编译和汇编这些步骤程序发生的变化

    现在大多数的程序都是在IDE上进行开发的,预处理、编译、汇编和链接这些过程都有编译器已经设定完成,而实际程序在这个过程发生了什么,我们就无从得知了。...但是作为程序员,我们有必要去了解在这个过程中我们的程序都发生了哪些变化。 下面就详细描述每一个步骤发生了什么。...参考《程序员的自我修养》 预处理 1.将所有的#define删除,宏定义进行替换。 2.处理所有条件预编译指令,比如#ifndef ,#define,#if,#elif等。...3.删除所有注释,包括单行注释 // 和 多行注释 /**/。 4.添加行号和文件名标识。 5.保留#program 编译器指令。 6.展开头文件 下面验证上述提到的预处理阶段做的事情。...对照我们上边写出程序,可以看出。宏定义被替换、单行注释和多行注释均被删除、条件编译指令被删除、添加了行号和文件名。

    66530

    抽丝剥茧C语言(高阶)程序环境和预处理

    程序环境和预处理 程序的翻译环境和执行环境 运行环境 预处理 程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。...开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。...宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。 5. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。...宏和函数对比 属性 #define定义宏 函数 代码长度 每次使用时,宏代码都会被插入到程序中。...test.h和test.c使用了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。

    53500

    资讯 | Qt 5.15中的新功能

    Qt QML 引入了内联组件(能够在同一文件中声明多个QML组件)。 引入了所需的属性。 添加了一种向QML注册类型的声明方式。 qmllint提供警告了更多不推荐使用的QML功能。...添加了qmlformat工具,该工具可以根据QML编码约定自动格式化任何QML文件。 添加了对Nullish合并运算符的支持。...向指针处理程序添加了cursorShape属性。当活动状态为true时,大多数指针处理程序(例如DragHandler)都会更改光标。...当鼠标悬停在包含HoverHandler的Item上时,HoverHandler将对其进行更改。 现在,独立于图形API的渲染架构的可选预览也支持iOS上的Metal。...(在eglfs_viv后端中) 新模块 Qt Quick 3D 后期处理效果。 自定义几何API(C++网格)。 用于节点旋转的四元数API。 右手坐标系(以前为右或左)。

    3.6K10

    uniapp 微信小程序 控制台警告和错误处理

    警告 ---- 微信小程序默认开启了索引功能,但是因为我们没有配置索引策略,导致出现了这么一个警告 解决这个警告也非常简单,因为一般情况项目不需要被微信索引,所以我们只需要关闭默认索引功能即可 [sitemap...] 将被索引 双击 manifest.json, 以源码视图打开, 在 mp-weixin.setting 中添加 "checkSiteMap": false "mp-weixin": { /* 小程序特有相关...false, "checkSiteMap": false }, "usingComponents": true } 补充: 在使用原生小程序开发处理该警告...错误 ---- 微信小程序控制台报错如下图所示 TypeError: Cannot read property ‘forceUpdate’ of undefined 这个错误的原因很简单,是因为我们没有给项目配置小程序...appid,所以只需完成appid配置即可 双击 manifest.json, 找到微信小程序配置, 输入微信小程序的appid,重新编译即可

    2K10

    【程序的编译和预处理】源文件到可执行程序到底经历了什么?

    ---- 目录 1.程序的翻译环境&2.执行环境 3.详解:程序的编译和链接(翻译环境) 4.预处理符号详解 4-1内置的预处理符号  5.预处理指令 5-1#define定义符号 5-2#define...#和##宏的妙用 6-1#  6-2## 6-3带有副作用的宏参数 7.宏和函数的对比(蓝色标明考虑角度) 8.条件编译 9.预处理指令#include 10.面试题:宏实现offsetof ----...1.程序的翻译环境&2.执行环境 C语言程序实现的两种环境: 第一步:翻译环境--使得源程序转换为机器可执行的机器指令 第二步:执行环境--实现可执行代码 3.详解:程序的编译和链接(翻译环境...) 多个test.c文件,多个test.obj,生成一个test.exe 编译器介绍:  链接库:库文件里的库函数/第三方库 4.预处理符号详解 4-1内置的预处理符号 int...参数列表的左括号必须和name紧邻(函数可以,宏不可以) 写宏的时候,对于参数不要吝啬括号 #define NUM 100;//错误用例1 #define DOUBLE (x) x*x//错误用例2和

    30830
    领券