C语言——可执行程序过程

这篇具有很好参考价值的文章主要介绍了C语言——可执行程序过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 我们在编写代码的时候,不知道大家是否和一开始的我一样,在运行代码的时候就直接CTRL+F5运行了呢??一开始,我只知道会生成一个.exe的可执行文件,中间的原理我一点也不知道。
  • 今天就由我带领大家对生成可执行的文件有更深的一层理解。

  •  程序的翻译环境和执行环境

  • 在ANSI C的任何一种实现中,存在两个不同的环境。
  • 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第二种是执行环境它用于 实际执行代码。
  • C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言
  •  组成一个程序的每个源文件通过编译过程分别转换目标代码。
  • 每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C库函数中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数链接到程序中。

  • 翻译也分为几种过程:

  • C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言
  •  在预处理中,我们可以通过在Linux环境下,用gcc text.c -E -o text.i 来看一看在预处理中编译器做了什么
  • C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言
  •  我们发现短短10行的代码变成了700多行,这是因为在预处理中,包含的头文件被展开了,而且宏已经被替换了。
  • 在这里,大家有没有想过一个问题呢??在预处理阶段中,到底是宏替换先执行还是去注释先执行呢???

C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言 C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言

 文章来源地址https://www.toymoban.com/news/detail-647498.html

  •  经过证明,我们发现去注释是先执行的,如果是宏替换先执行的话,那么就不会有Hello World的输出了。
  •  


    预定义的符号:

  • _FILE_  //进行编译的源文件
  • _LINE_ //文件当前的行号
  • _DATE_ //文件被编译的日期
  • _TIME_ //文件被编译的时间
  • _STDC_ //如果编译器遵循ANSI C ,其值为1,否则为定义

关于宏的定义,其实本质上就是在预处理的阶段被替换。C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言

  • 我们来看这个代码就知道了,我们用宏定义了SQUARE ,如果没有我刚刚说宏的本质是替换是不是很多人会以为答案是36,经过我上面说的,宏的本质是替换,所以就替换成了printf("%d\n",5+1&1+5);这个,答案就是11  
    #define SQUARE(x)  x*x
    int main()
    {
    	int a = 5;
    	printf("%d\n", SQUARE(5 + 1));
    
    	return 0;
    }

    C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言

     


  • 宏的好处:

  •  在用于函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间多,所以宏比函数在程序上的规模和速度上更胜一筹。
  • 第二个就是宏是无关类型的
  • 宏的坏处:

  • 宏不能递归,也不好调试
  • 参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能产生不可预料的问题

    综上所述,其实我更推荐用函数,函数可以调试,而且在C++中用inline也综合了宏和函数的优缺点。


命名约定

 宏名全部大写 函数名不要全部大写


  • 命令行定义
  • 在许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要 编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果 机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大写,我们需要一个数组能够大写。)
  • 比如,下面代码我就用到了命令行定义
  • C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言

C语言——可执行程序过程,C语言从0到1,linux,服务器,经验分享,c语言


常见的预处理指令 

  • #ifndef 
  • #define
  • #if
  • #endif
  • #elif
  • ...
  • 当然还有很多预处理指令,这里就不再叙述了。

     

  • 这里预处理指令中,我们常见的就是
  • #ifndef include <stdio.h>
  • #define include <stdio.h>
  • #endif 
  • 这里是为了不让头文件重复包含,在我们的第一个图中就讲到了,在预处理中头文件会被展开,所以开text.i文件中会有700多行的代码
  • 当然#pragma once也可以防止头文件被重复包含

  • 最后:讲一讲大家在做大型项目中,头文件和定义总是分开的,都会用到#include "text.h"  或#include <filename.h>,我来讲一讲它们之间的差别。

  • 其实它们只是查找策略的不同,#include "filename.h"查找的策略是现在源文件所在的目录下查找,如果找不到编译器就会查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误

  • 而#include <filename.h> 是直接查找库函数头文件中的标准位置中查找头文件

 

到了这里,关于C语言——可执行程序过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP服务器的演变过程:C++使用libevent库开发服务器程序

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 在上一章节介绍了如何使用epoll构建reactor网络模型开发高效的服务器,有了上一节的基础,本节将介绍

    2024年01月23日
    浏览(39)
  • Linux环境下部署项目到服务器完整过程

    1,首先,选择一款云上服务器(这里用的是腾讯云),右侧搜索栏输入云服务器或轻量服务器(这里用的轻量服务器),立即选购 2,选择自己要的服务器配置,系统镜像选择Centos即可 3,实例创建成功后,点击控制台搜索请量服务器找到新创建的实例重置密码 4,点击防火墙

    2024年02月02日
    浏览(36)
  • linux服务器ubuntu定时任务cron设置每秒执行

    后端的同学经常会遇到在服务器做一些定时脚本处理,比如定时清理日志,定时请求某个接口做特殊的业务处理,大多数linux版本都会带cron服务,以ubuntu服务器做个示例。 cron 是一个在 Unix-like 操作系统中用于定时执行任务的工具。它是 “Chronos”(希腊语,意为时间)的缩写

    2024年02月02日
    浏览(46)
  • VMware虚拟机,Linux DHCP服务器配置过程。

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、实验目标(以自身情况为准) 二、所需配置 三、静态IP配置 四、配置DHCP服务器 五、配置DHCP中继 六、防火墙配置 配置 DHCP服务器 与 中继 ,使多个子网的客户机可以通过服务器获取 动态IP地址 。

    2024年02月08日
    浏览(43)
  • 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

    Rust 已经听了无数遍,我很清楚它很强!但我也刚了解到它比较难学!那么加上 ChatGPT 呢?下面的代码就是在 ChatGPT 加持下写出来的,我只起到了辅助作用!只能说它们都很厉害! Rust(又称为 Rust programming language)是一种系统编程语言,主要用于开发底层系统和应用程序,如

    2024年02月13日
    浏览(55)
  • 【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本

    业务场景:该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 连上服务器后,在任意位置都可以执行: crontab -e 如果没有进入 编辑cron任务模式 根据提示查看我们的服务器上是否未安装crontab没有则

    2024年02月14日
    浏览(49)
  • Tauri 提供界面 + 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

    Tauri 是一个用于构建跨平台桌面应用程序的工具和框架。它的目标是通过将 Web 技术与本地功能结合,使开发者能够以简单、高效的方式创建现代的桌面应用。 以下是 Tauri 的一些主要特点和概述: 跨平台支持 :Tauri 允许你构建跨平台的桌面应用程序,它支持 Windows、macOS 和

    2024年02月15日
    浏览(38)
  • Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

    🍉 CSDN 叶庭云 : https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中,开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统,与 Windows 或 MacOS 并驾齐驱,尤其在服务器和开发环境中占据重要地位。Linux 命令,简而言之,就是指导计算机执行

    2024年04月12日
    浏览(44)
  • Linux socket 搭建TCP服务器(C语言)

    ​ 在标题之前,先提几个问题,方便下次查看理解。 什么是TCP TCP服务器需要用到哪些函数 如何简单的搭建一个TCP服务器 ​ TCP 是一种传输层协议,可以提供可靠的数据传输服务。它是面向连接的,具有可靠性、流量控制、拥塞控制以及双工通信的特点。 1. socket ​ socket 作

    2024年04月17日
    浏览(28)
  • Linux+服务器后台运行程序

    在Linux服务器直接运行程序,程序运行的时间较长,程序经常会因为网络连接问题异常终止,一直盯着程序运行又费时费力,这时后台运行程序是更好的解决方式。But,如果服务器重启了,那所有进程都断掉了,只能重新跑代码。 screen 假如遇到一些比较费时间的程序,但是又

    2024年02月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包