C语言【编译和链接】

1.程序执行过程

C语言的编译和链接是将源代码转换为可执行程序的过程。下面是C语言编译和链接的基本步骤:

  1. 预处理:在编译前,预处理器会对源代码进行。它会处理以"#"开头的预处理指令,#include和#define,并将它们替换为应的内容。

  2. 编译:编译器将预处理后的源代码转换为汇编代码。它会检查语法错误和类型错误,并相应的错误信息。

  3. 汇编:汇编器将汇编代码转换为机器码,就是目标。目标文件包含了可执行程序的二制指令和。

  4. 链接:链接器将目标文件与其他必要的库文件进行链接,生成最终的可执行程序。它会解析函数调用和全局量引用,并将它们与相应的定义进行关联。

在链接过程中有两种常见的链接方式:

静态链接:静态链接器将目标文件和库文件的代码和数据合并到一个单独的可执行文件中。这意味着所有的代码和数据都被复制到最终的可执行文件中,使得可执行文件可以独立运行。

动态链接:动态链接器在运行时将目标文件和库文件的代码和数据链接到可执行程序中。这意味着多个程序可以共享同一个库文件,减少了可执行文件的大小。动态链接还可以在库文件更新时,无需重新编译可执行文件。

2.常见的预定义符号

__FILE__ 	// 进行编译的源文件
__LINE__ 	// 文件当前的行号
__DATE__ 	// 文件被编译的日期
__TIME__ 	// 文件被编译的时间
__STDC__ 	// 如果编译器遵循 ANSI C,其值为 1,否则未定义

好像这样看是不是还是不太了解,我们直接上代码,一起观察这些预定义符号

至于__STDC__: 是一个预定义的宏,用于指示编译器是否符合ISO C标准(ANSI C标准)。如果编译器遵循ISO C标准,则该宏会被定义为1;否则,它未定义或者被定义为其他值。

至于这些符号具体在项目中有没有用,很有用,你完全可以用它们去找到你的程序具体在哪个代码,哪一行出现了问题,并且很多大型项目中,都会用它写一个名叫日志系统的模块

3.#define的应用

我们还是直接来看代码好了

当然在宏中也有特殊符号‘#’和‘##’,

我想对他们的使用应该有一定了解了

注意:宏只是将内容替换,很可能因为你在定义宏的时候没有明确给出括号,而导致运行的结果和你期待的结果完全不同。

4.宏和函数的区别

5.取消宏定义(#undef)

当然还有(#if,#else,#else if,#endif)跟if,else表达的含义一样

6.#error

7.#include头文件的包含

在包含头文件的时候,我们有很大的可能会对同一个头文件,进行多次包含,在预编译的时候将你所包含的头文件全部替换成文本,给代码的编译,链接等增加不必要的负担。为了避免这种事情的发生,我们可以使用

#ifndef和#indef来检测如果多次包含,就不进行包含

#ifndef SOME_HEADER_FILE_H
#define SOME_HEADER_FILE_H

// 在这里放置头文件内容

#endif // SOME_HEADER_FILE_H

当然这种没有我接下来介绍的好用。

#pragma once//只需这一行便足够

8.每期一问

写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

考察: offsetof宏的实现

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法笔记————ST表

运用了倍增思想,从小到大处理 1.【模板】ST 表 // Problem: // P3865 【模板】ST 表 // // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P3865 // Memory Limit: 125 MB // Time Limit: 800 ms // // Powered by CP Editor (https://cpedi…

Kotlin学习日志(一)TextView、Button、Toast的使用(1)

android:layout_width“wrap_content” android:layout_height“wrap_content”/> import kotlinx.android.synthetic.main.activity_main.* 这句话的意思是引进Kotlin的的控件变量自动映射功能,接下来只要是这个activity_main.xml文件中的控件,我…

非关系型数据库——Redis基本操作

目录 一、Redis数据库常用命令 1.Set——存放数据 2.Get——获取数据 3.Keys——获取符合条件的键值 4.Exists——判断键值是否存在 5.Del——删除指定键值 6.Type——获取键值对应的类型 7.Rename——对已有键值重命名(覆盖) 8.Renamenx——对…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里,我们需要整理一下之前学习的epoll模型,并根据之前的epoll模型,提出弊端,进而整理epoll反应堆模型,进一步深刻理解,这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

虚幻UE5智慧城市全流程开发教学

一、背景 这几年,智慧城市/智慧交通/智慧水利等飞速发展,骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…

【软件工程】测试规格

1. 引言 1.1简介 本次的测试用例是基于核心代码基本开发完毕,在第一代系统基本正常运行后编写的,主要目的是为了后续开发与维护的便利性。 该文档主要受众为该系统后续开发人员,并且在阅读此文档前最后先阅读本系统的需求文档、概要设计文…

海外视频网站推广实战需掌握的10个关键性数据指标-华媒舍

在海外视频网站推广实战中,了解和掌握一些关键性数据指标是非常重要的。这些指标可以帮助我们评估视频网站的推广效果,优化推广策略,提升用户体验。以下是推广人员在实战中应该了解和关注的十个关键性数据指标: 1. 视频创意点击率…

PS入门|规规矩矩的图形怎么抠出来?

前言 上一次讲解到用魔棒工具蒙版可以把需要的区域抠出来,但仅适用于边缘锐利的类型。 但魔棒工具并不适用于边缘区域有过渡色的内容,比如下面这张照片: 如果直接使用魔棒工具进行选择,就会出现下面这种情况: 在边界…

数据挖掘入门项目二手交易车价格预测之建模调参

文章目录 目标步骤1. 调整数据类型,减少数据在内存中占用的空间2. 使用线性回归来简单建模3. 五折交叉验证4. 模拟真实业务情况5. 绘制学习率曲线与验证曲线6. 嵌入式特征选择6. 非线性模型7. 模型调参(1) 贪心调参(2)…

内表GROUP BY

内表GROUP BY REPORT z_test_table_lhy. DATA: price TYPE sflight-price. SELECT MIN( price ) AS m,carridINTO DATA(t_temp)FROM sflightGROUP BY carridHAVING MAX( price ) > 10. "Having从句中比较统计结果时,需要将统计函数重写一遍,而不…

Android数据存储技术

一、文件存储 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layout_height"match_parent" ><EditTextandroid:id&qu…

树莓派安装Windows搭建网盘和下载机

0 需求分析 在同一个局域网内&#xff0c;同时有多种设备&#xff08;Windows&#xff0c;Linux&#xff0c;Android&#xff09;需要进行大量的数据共享。另外&#xff0c;还时常需要从百度网盘/夸克网盘等网盘下载文件。不难看出&#xff0c;我的需求很简单&#xff0c;就是…

异常的处理

异常处理概述 在编写程序时&#xff0c;经常要在可能出现错误的地方加上检测的代码&#xff0c;如进行x/y运算时&#xff0c;要检测分母为0&#xff0c;数据为空&#xff0c;输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿&#xff0c;可读性差&…

论文笔记:Large Language Models as Analogical Reasoners

iclr 2024 reviewer打分5558 1 intro 基于CoT prompt的大模型能够更好地解决复杂推理问题 然而传统CoT需要提供相关的例子作为指导&#xff0c;这就增加了人工标注的成本——>Zero-shot CoT避免了人工标注来引导推理 但是对于一些复杂的任务难以完成推理&#xff0c;例如c…

Ubuntu22.04中基于Qt开发Android App

文章目录 前言在Ubuntu22.04中配置开发环境案例测试参考 前言 使用Qt开发手机应用程序是一种高效且灵活的选择。Qt作为一个跨平台的开发框架&#xff0c;为开发者提供了统一的开发体验和丰富的功能库。首先&#xff0c;Qt的跨平台性让开发者可以使用相同的代码库在不同的操作系…

SSM项目实战——哈哈音乐(四)前台模块开发

1、项目准备 ①导入依赖和前端资源 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x…

路由策略与路由控制之双点双向重发布(OSPF-ISIS)实验

双点双向重发布在路由协议中&#xff0c;特别是在OSPF&#xff08;开放式最短路径优先&#xff09;与IS-IS&#xff08;中间系统到中间系统&#xff09;等协议之间&#xff0c;指的是在两个协议间或者两个进程间进行路由信息共享的机制。这种机制涉及到在两个不同的协议区域使用…

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

电脑上音频太多,播放速度又不一致,如何批量调节音频播放速度?

批量调节音频速度是现代音频处理中的一个重要环节&#xff0c;尤其在音乐制作、电影剪辑、有声书制作等领域&#xff0c;它能够帮助制作者快速高效地调整音频的播放速度&#xff0c;从而满足特定的制作需求。本文将详细介绍批量调节音频速度的方法、技巧和注意事项&#xff0c;…

Docker 安装 Linux 系统可视化监控 Netdata

docker 安装 netdata 前提准备Docker 两种方式部署 Netdata1、使用 docker run 命令运行 netdata 服务2、使用 docker compose 运行 netdata 服务 Netdata 服务可视化界面Netdata 汉化处理 前提准备 说明&#xff1a;此处使用 windows11 安装的 docker desktop & wsl2/apli…