C++ 中 main 之前发生了什么?

2024-01-23

我知道在 C 中,在应用程序可以开始之前main(),某些实体必须:

  1. 初始化全局变量
  2. 将堆栈指针设置为最低堆栈区域地址(假设堆栈向上增长)

问题 1 - 做这些事情的实体是什么?谁写的?

问题 2-C++ 中还有其他东西吗? 我假设对象构造函数和初始化都是在应用程序过程中完成的,之后main()


很大程度上取决于执行环境。在 C 运行时启动之前,操作系统加载程序可能会完成大量工作,这是可执行文件运行的特定部分。设置执行环境的这个依赖于操作系统的部分对于所有本机(机器语言)可执行文件都是通用的,无论源实现语言如何。

操作系统扮演的角色以及可执行文件中的代码执行的内容因执行环境而异。操作系统加载程序(在非独立系统中)负责将代码加载到内存中,并且可能涉及加载和链接动态链接库(DLL 或共享库,具体取决于操作系统术语)。无论是操作系统还是 C 运行时责任,通常会发生以下情况:

  • 堆栈的建立
  • 已初始化静态数据的零初始化
  • 显式初始化静态数据的初始化
  • C 库初始化(通常 stdio 和堆管理需要一些初始化)
  • 对于 C++ 调用静态构造函数。
  • 创建堆栈帧main() (argv, argc参数)

例如,在 GCC 和其他一些编译器中,在程序启动之前由程序而不是操作系统执行的部分是由称为crt0.o https://en.wikipedia.org/wiki/Crt0。这通常是用汇编程序编写的,并且默认情况下会自动链接。

有关更多示例和讨论,请参阅:

  • Linux x86 程序启动 https://web.archive.org/web/20191210114310/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
  • 典型的独立嵌入式系统启动 https://www.oreilly.com/library/view/programming-embedded-systems/0596009836/ch04.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中 main 之前发生了什么? 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • C++ 和序列化:有什么方法可以进行某种内省吗?

    我读过一些例子维基百科 http en wikipedia org wiki Type introspection C 2B 2B但我正在寻找一些现实生活中的例子 如何使用内省 为什么 它有助于编写干净的代码 以及代码本身 例如 有没有办法
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 为什么我不能从对中返回 unique_ptr?

    为什么我不能从对中返回 unique ptr include
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • “显式”关键字对返回值优化 (RVO) 有何影响?

    以下代码工作得很好 显示 RVO struct A A int cout lt lt A A n constructor A const A cout lt lt A A const A n copy constructor A foo r
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • 表动态加载SAPUI5/UI5

    我想在 SAPUI5 Table 组件中显示大量数据 我曾经通过动态加载来实现这些数据表 这意味着该表最初加载了约 50 条记录 用户向下滚动足够远后 下一组 50 条记录将加载到表中 这样我就可以显示包含超过 160 000 个条目的表格
  • 如何调试在客户计算机上崩溃的 Windows 应用商店应用程序?

    我收到一位客户的支持电子邮件 说他的应用程序在启动时崩溃 他收到的只是一条类似以下的消息 应用程序名称 遇到问题您可以向 Microsoft 发送有关以下内容的信息 出了什么问题来帮助改进这个应用程序 将发送给 Microsoft 的文件
  • Android Studio 禁用换行

    我在 Android Studio 上有这个奇怪的换行符 我想禁用它 因为它让我害怕 It s also available under the context menu
  • 放弃对 JRE 1.3 的支持

    我们提供了一个流行的开源 Java FTP 库 称为edtFTPj http www enterprisedt com products edtftpj overview html 我们希望放弃对 JRE 1 3 的支持 这将清理代码库 并
  • 将 Python 字典列表转换为 Postgresql json 数组

    我正在尝试将 jsonb 元素的 Python 2 7 列表插入到具有数据类型列的 Postgresql 9 4 表中 jsonb 这是一些代码 import json anArray name Joe age 51 yob 1964 ge
  • 通过手写汇编调用本机代码

    我正在尝试从托管程序集中调用本机函数 我已经在预编译库上完成了此操作 一切都很顺利 目前我正在建立自己的图书馆 但我无法完成这项工作 本机 DLL 源代码如下 define DERM SIMD EXPORT declspec dllexpo
  • 春天。 @RequestBody 的映射字段与 @PathVariable

    现在我有这样的代码 RestController public class ChildController RequestMapping value parents parentId addChild method RequestMetho
  • 从选定的数据库中选择选项值

    我有一个小问题 我有一个 edit php 页面 该页面列出了可以编辑的产品信息 我运行一个查询 while rows mysql fetch assoc query echo
  • 如何使用 Cython 将 Python 3 编译为 C

    我正在尝试将 Python 3 脚本转换为 C 然后将该 C 文件编译为可执行文件 我有这个简单的 python 脚本 def greet name print Hello 0 format name if len name gt 0 el
  • 更改命名空间前缀 WCF 信封

    我想知道是否可以更改 WCF SOAP 请求的命名空间前缀 正如您在下面的示例中看到的 The Envelope 的命名空间为 http www w3 org 2005 08 addressing 前缀为 a 我想将其更改为 foo 我怎样
  • 如何将任务的已取消状态传播到继续任务

    我在我的应用程序中使用任务并行库 我有一个任务 我们称之为 DoSomething 可能会被取消 无论任务出现故障 取消还是成功完成 我都会向该任务附加一个延续来执行一些清理工作 在启动此任务的代码中 我想返回一个 Task 对象 其状态
  • SWIG C++ 到 Python:警告(362):运算符=被忽略

    我正在将 C 类导出到 Python 我注意到在编译过程中 SWIG 发出以下警告 Warning 362 operator ignored 我不确定为什么操作符超载 因为它在SWIG 文档 http www swig org Doc1 3
  • camera2 捕获的图片 - 从 YUV_420_888 转换为 NV21

    通过camera2 API 我们接收以下格式的图像对象YUV 420 888 然后我们使用以下函数转换为NV21 private static byte YUV 420 888toNV21 Image image byte nv21 Byt
  • Oracle中INSTR和LIKE有什么区别?

    有人可以告诉我两者之间的区别吗INSTR and LIKE在甲骨文中 Oracle10g中哪一个更快 这取决于数据和模式 如果你使用like a 那么 Oracle 可以使用 BTree 索引来查找匹配项 因为它可以以模式开头搜索 BTre
  • Angular CLI 无法创建新项目

    如何从 angular cli 创建新项目 Angular CLI 有问题 已经关门了 我认为仍然存在问题https github com angular angular cli issues 5543 event 1009616731 h
  • 故事板静态单元:dequeueReusableCellWithIdentifier 返回 nil

    使用故事板 静态单元格cellForRowAtIndexPath 线 UITableViewCell cell tableView dequeueReusableCellWithIdentifier CellIdentifier 总是返回n
  • Capybara webkit 不传递来自 Angular 的参数

    我正在尝试将 selenium 测试套件移植到 capybara webkit Rails 应用程序在 Rails 视图中嵌入了一个角度应用程序 并且其行为不符合预期webkit 像这样的测试 需要 spec helper feature
  • CSS 线性渐变和 Canvas 线性渐变与不透明度设置不同

    我想在画布上实现 CSS 定义的相同线性渐变外观 使用了一种在不使用透明度设置之前效果很好的方法 当使用相同的线性渐变颜色设置定义 rgba 颜色值时 结果看起来不一样 请参阅以下链接 JSFiddle Example https jsfi
  • 如何通过 System.out.println("Morning") 创建对象,REACHABLE?

    在下面的声明中 System out println Morning 包含值 Morning 的对象是在字符串池中创建的 而且我们没有明确存储它的地址 但这个对象仍然是可达的 如果我们尝试重新做System out println Morn
  • C++ 中 main 之前发生了什么?

    我知道在 C 中 在应用程序可以开始之前main 某些实体必须 初始化全局变量 将堆栈指针设置为最低堆栈区域地址 假设堆栈向上增长 问题 1 做这些事情的实体是什么 谁写的 问题 2 C 中还有其他东西吗 我假设对象构造函数和初始化都是在应