c语言的程序环境与预处理详解

 更新时间:2022年02月09日 08:40:33   作者:.SacaJawea  
大家好,本篇文章主要讲的是c语言的程序环境与预处理详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

c语言代码的实现包含两种环境

1.翻译环境,将源代码转化成可执行的机器指令

2.执行环境,执行代码

1.翻译环境

包括两个过程,编译与链接
·程序中每一个源文件通过编译器转化成目标文件(obj)
·这些目标文件又通过链接器捆绑在一起
·链接器同时会链接标准库中的函数以及程序员个人的库到程序中
·形成可执行代

编译分成三个阶段:预编译(预处理)->编译->汇编

预处理阶段

1.完成头文件的引用

2.#define定义的宏与符号的替换

3.注释的删除

编译阶段:将代码转化成汇编代码

1.语法分析

2.词法分析

3.语义分析

4.符号汇总

汇编阶段:生成符号表,将汇编指令转化成二进制的机器指令

链接阶段:将多个目标文件与链接库进行链接

1.合并段表

2.符号表的重定向与重定位

2.运行环境

1.在有操作系统的环境中,程序由操作系统加载到内存中。在独立的环境中,这个操作手动完成。

2.程序从main函数开始执行

3.程序调用堆栈

4.终止程序

3.预处理详解

3.1#define定义的符号

符号名一般大写,后面不要加上;
#define MAX 100

3.2#define定义的宏

#define SQUARE(x) ((x) * (x))
宏的名字与参数之间不能加空格;尽量多加括号,避免错误

3.3#define的替换规则

#define M 100
#define MAX(X,Y)  (X) > (Y) ? (X) : (Y)

int main()
{
	int max = MAX(M,50);//这里的M会被先替换成100
	printf("%d",max);
}

1.如果有宏,先查看宏的参数有没有#define定义的符号,如果有则替换

2.将替换的文本与程序中的宏替换3.再查看是否有定义的符号,如果有则替换

在这里插入图片描述

替换#define定义的符号时,不会替换字符串常量中的内容。
宏的参数中能出现define定义的符号,但是宏不能实现递归

3.4#与##

在宏的定义中(# + 参数)能将参数转换成对应的字符串

在这里插入图片描述

##能连接两个符号

在这里插入图片描述

4.宏与函数对比

宏的优点

1.宏的参数类型不用声明

2.当运算量较小时,宏的运算时间与代码量是远小于函数的

缺点

1.宏类型无关,不够严谨

2.宏不能调试

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

4.宏可能带来运算优先级的问题

5.#undef

用于移除宏定义

6.条件编译

#if与#endif为一组,如果#if后的表达式为真,执行代码直到#endif

在这里插入图片描述

但是#if后面不能写变量

多个分支的条件编译#if,#elif,#elif,#else,#endif

判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol

7.文件包含

#include后用双引号,编译器会先从本地目录下查找,找不到再去库函数中找。用<>编译器直接在库函数中找

为了防止头文件被反复包含,用#pragma once,写在头文件第一行

或者用
#ifndef NAME
#define NAME
//头文件内容
#endif

总结

到此这篇关于c语言的程序环境与预处理详解的文章就介绍到这了,更多相关c语言程序环境与预处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 中virtual 虚函数用法深入了解

    C++ 中virtual 虚函数用法深入了解

    这篇文章主要介绍了C++ 中virtual 虚函数用法深入了解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C和C++中argc和argv的含义及用法详解

    C和C++中argc和argv的含义及用法详解

    argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,这篇文章主要介绍了C和C++中argc和argv的含义以及用法,需要的朋友可以参考下
    2022-11-11
  • C语言实现strlen的三种方法小结

    C语言实现strlen的三种方法小结

    本文主要介绍了C语言实现strlen的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • C语言实现简单的贪吃蛇游戏的示例代码

    C语言实现简单的贪吃蛇游戏的示例代码

    这篇文章主要为大家详细介绍了C语言如何实现经典贪吃蛇游戏,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • Qt之简单的异步操作实现方法

    Qt之简单的异步操作实现方法

    这篇文章主要介绍了Qt之简单的异步操作实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 使用OpenGL创建窗口的示例详解

    使用OpenGL创建窗口的示例详解

    OpenGL,也就是Open Graphics Library。其主要就是用于我们去渲染2D、3D矢量图形的一种跨语言、跨平台的应用程序编程接口,这篇文章主要介绍了使用OpenGL创建窗口,需要的朋友可以参考下
    2022-04-04
  • C++数据模型应用在QML委托代理机制中

    C++数据模型应用在QML委托代理机制中

    这篇文章主要介绍了在QML委托代理机制中使用C++数据模型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Qt使用QListWidget实现自定义Item

    Qt使用QListWidget实现自定义Item

    这篇文章主要为大家详细介绍了Qt如何使用QListWidget实现自定义Item的效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • C++私有继承(三)

    C++私有继承(三)

    这篇文章主要介绍了C++私有继承(三),前面的文章我们已经介绍过了C++私有继承(一)和(二),下面小编就继续基于之前的内容继续向大家介绍C++私有继承,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • C语言实现获取内存信息并输出的实例

    C语言实现获取内存信息并输出的实例

    这篇文章主要介绍了C语言实现获取内存信息并输出的实例的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论