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

C语言】预处理程序环境

二、详解编译+链接 其中,在编译过程中,符号汇总是指将所有.c文件的函数名汇总在一起;在汇编过程中的形成符号表是指,将所有.c文件中的函数都给一个地址,其中,在主函数中的函数如果只有声明时,会给一个无效的地址...,例如空地址,但是它的有效地址可能在另一个.c文件中定义了;然后会在链接器中的符号表的合并和重定位中,取它的有效地址;在链接器中的合并段表中,将所有的.o文件(目标文件)一一对应的匹配合并,目标文件是有格式的...替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。...宏的缺点: 当然和函数相比宏也有劣势的地方: 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 宏是没法调试的。...#endif //常量表达式由预处理器求值。 如: #define __DEBUG__ 1 #if __DEBUG__ //..

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

    C语言程序的编译、预处理

    3.链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。...而源程序通过编译和链接最终形成可执行程序,但是编译本身也分为几个阶段:预编译/预处理——编译——汇编 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在...__ //如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是语言内置的 int main() { int i = 0; FILE* pf = fopen("log.txt", "w...#和## 开始之前,我们可以想一个问题:如何把参数插入到字符串中❓ 我们要先理解一下,在C语言中,下面两句代码是能达到相同结果的: #include int main() {...所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是: 把宏名全部大写,函数名不要全部大写 #undef :这条指令用于移除一个宏定义。

    26620

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

    掌握学习各种预处理知识 程序的翻译环境和执行环境 ---- 任何一个代码从源文件(.c文件)到可执行文件(.exe文件)都经历了两个环境 翻译环境: 在这个环境中源代码被转换为可执行的机器指令...(linker)捆绑在一起,形成一个单一而完整的可执行程序(.exe文件) 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个 人的程序库,将其需要的函数也链接到程序中... 宏替换(#define)  条件编译的处理(#if #endif等)  去注释(//) 示例:test.c #include #define X 10 #define Y 20...),存储函数的局部变量和返回地址;程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值 终止程序:正常终止main函数,也有可能是意外终止 预处理详解...:(int *)malloc(10 * sizeof(int)); 注:非常便利,简直是奇效~ 宏和函数优劣表 图片 宏和函数命名约定 一般来讲函数的宏的使用语法很相似(语言本身没法区分二者

    64250

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

    程序环境外,C/C++在预处理阶段还有各式各样的预处理指令等着我们去发掘,一起来看看吧!...本文主要分为两部分:程序环境讲解和预处理指令详解,其中程序环境需要在Linux环境下用gcc编译器展示,光是环境配置就比较麻烦,因此这部分会偏向于理论知识,不需要去实践,理解性记忆就好了;预处理指令在VS...宏:宏在预编译阶段就已经完成了代码的替换,在后面无需进行操作 因此对运行速度有追求的程序会大量使用宏 函数:函数在使用时,存在调用和返回这两个操作,会造成额外的开销 C语言中函数调用需要经过一系列的操作...推荐了解其他预处理指令 #error #pragma #line  …… ---- 总结   以上就是关于C语言程序环境和预处理的所有内容了,如果你在看完此文后能对C语言代码的运行有一个新的认识,那么本文就值了...当然,只是C语言整体知识系列划上了句号,其他文章还是会继续更新下去的, 比如 数据结构 | C 这个系列,还有高深一些的 C语言高阶——函数栈帧的创建和销毁 ,其他好玩的小程序、有意义的题解等。

    24420

    C#图像处理——ImageProcessor

    我之前也做过很多此类项目,但是就我自己来说每次处理方式还都不一样,有用OpenCV的,有用Magick的,牵涉到影像还用了GDAL,当然有些还是自己纯手工写的,以上这些方式各有各的优点,需要针对不同项目合理选择或组合...本次又有个项目需要做图像处理,本着找点新东西的想法,没有用原来的这些代码,试着Google了一下,找到了一个.NET下图像处理的框架,不管三七二十一先拿来用用吧。...打开图像 常用的图像基本都支持,打开也非常方便,代码如下,path为文件路径。...var imageFactory = new ImageFactory().Load(path) 显示图像 可以直接在picturebox控件中显示原始图像处理的结果(其每一步处理完也同样为ImageFactory

    2.1K70

    C语言】预处理

    ANSI C,其值为1,否则未定义 以上是C语言设置的一些预定义符号,是可以直接使用的,预定义符号在预处理阶段处理 二、#define定义常量 基本语法: #define name stuff 例子:...,在宏较长的情况下可能会导致大幅度增加程序的长度 2、宏无法调试 3、宏与类型无关,这虽然是它的一个优点,也是一个缺点,因为这导致它不够严谨 4、宏可能会带来运算优先级问题,如上面第三条所说,容易导致程序出错...(三)、宏和函数的对比 属性 #define定义宏 函数 代码长度 每次使用时,宏代码都会被插入到程序当中,除了非常小的宏之外,程序的长度会大幅度增长 每次使用函数时,都调用同一个地方的同一份代码 执行速度...#endif //常量表达式由预处理器求值。 //如: #define __DEBUG__ 1 #if __DEBUG__ //.....c语言给我们很多预处理指令,我们工作的过程中可能会用到,大家自行查找学习 今日分享就到这里了~

    10810

    C语言_预处理

    C语言_预处理 文章目录 C语言_预处理 0.引言 1.#include 2.#define (符号常量) 3....#error和#pragma预处理命令 6.#和##运算符 0.引言 C的预处理是在程序被编译之前执行的,包括将其他文件包含进正在编译的文件,定义符号常量和宏,条件编译和有条件的执行预处理命令。...使用引号时:会从待编译文件所在的目录里开始查找,一般用于程序员自己定义的头文件 使用尖括号:用于标准函数库的头文件,一般会在预先指定的编译器和系统目录中开始查找 2....#define(宏) 宏 ,是#define预处理命令定义的一种标识符,宏的定义可以带实参,也可以不带。...#error和#pragma预处理命令 格式:#error tokens 功能:打印出包含命令中指定标记的信息,具体内容和系统的实现有关。 ​

    1.1K10

    C语言】预处理

    预定义符号 C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。...#define SQUARE( x ) x * x 这个宏接收一个参数 x .如果在上述声明之后,你把 SQUARE( 5 ); 置于程序中,预处理器就会用下面这个表达式替换上面的表达式: 5 * 5...替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。...所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是: 把宏名全部大写 函数名不要全部大写 9. #undef 这条指令用于移除⼀个宏定义。...命令行定义 许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。

    8310

    C程序的编译链接预处理详解(C语言内功,精炼,基础)

    前言:大家好,这里是YY;此篇博客主要是程序的编译/链接/预处理详解的知识点;包含【程序的翻译环境和执行环境】【编译和链接的过程】【编译的几个阶段】【运行环境】【预定义符号】【define/undef...一.程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境 翻译环境,此过程中源代码转换为可执行的机器指令 执行环境,它用于实际执行代码 二.编译和链接的过程 三.编译的几个阶段...程序的执行便开始,接着调用main函数 开始执行程序代码,这个时候程序将使用一个运行的堆栈,存储函数的局部变量和返回值。...__DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 六.define/undef...) 例如: 1.预处理指令和普通判断语句的区别: 预处理指令在预处理阶段就将不要的代码删除 后面都要跟一个endif收尾 2.常见的条件编译指令: 普通条件编译:if/endif 多分支的条件编译

    16710

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

    程序环境和预处理 程序的翻译环境和执行环境 运行环境 预处理 程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。...链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。...翻译阶段 顺序是从左到右,用gcc编译器可以观察到: 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。...ANSI C,其值为1,否则未定义 这些预定义符号都是语言内置的。...所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是: 把宏名全部大写 函数名不要全部大写 **#undef ** 这条指令用于移除一个宏定义。

    52700

    C语言进阶(十五) - 预处理程序编译初步解析

    前言 本节主要介绍程序运行前的预处理(预编译)阶段的相关知识。同时简单介绍一个程序是如何从一行行代码到开始运行并得到结果的。 ---- 1....预处理 1.1 预定义符号 首先是C语言内置的预定义符号。...除非宏比较短,否则可能大幅度增加程序的长度。 宏的替换在预处理阶段完成,无法进行调试(程序运行时)。 宏是类型无关的,这意味着宏不够严谨。(双刃剑)。...链接器同时也会要引入标准C函数库中任何被该程序所用到的函数,而且他可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。...---- 结语 本节主要介绍了预处理阶段涉及的概念,了解更深层次的程序的编译与链接知识可以说是在修炼我们的内功,仅有本文还远远不够。 ---- END

    43320

    C语言】预处理详解

    预定义符号 C语言设置了一些预定义符号, 可以直接使用 ,预定义符号也是在 预处理期间 处理的。...,其值为 1 ,否则未定义 我们来看一下,在vs2022中是否遵循ANSI C(标准C) 由此可见,vs2022不遵循ANSI C 注:预定义符号在预处理间就被替换了 2....#define SQUARE( x ) x * x 这个宏接收一个参数 x .如果在上述声明之后,你把 SQUARE( 5 ); 置于程序中,预处理器就会用 下面这个表达式替换上面的表达式...命令行定义 许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。...,但肯定有些地方挖的不够深,如果想更加详细的了解这方面的点点滴滴,我们可以参考《C语言深度解剖》 OK感谢观看!!!

    8810
    领券