C++ 如何让代码在main()函数之前或者之后执行

2023-05-16

程序最早执行的函数其实并不是main,在main函数之前会有一系列初始化的操作(通常是由链接器等完成的)。比如在windows中,这个函数是mainCRTStartup,这个函数是链接器执行以初始化运行时库的,此函数又会调用CRTInit函数,该函数会对C全局变量、C内存分配以及C++中的全局类对象和构造函数进行初始化工作。

一、利用全局类对象或者变量

在C++编程中,可以利用定义全局类对象或全局变量,来实现让代码先于main()之前执行。另一种方式是定义一个全局变量为函数运行后的结果,那么该函数就会用于初始化,会先于main执行。

示例代码

#include <iostream>
#include <stdio.h>
using std::cout;
using std::endl;

class ClassInit
{
public:
	ClassInit()
	{
		cout << "ClassInit() constructor" << endl;
	}
	~ClassInit()
	{
		cout << "ClassInit() destructor" << endl;
	}
};

int init_befor_main()
{
	cout << "init_befor_main()" << endl;
	return 0;
}

ClassInit cls;
int g_nValue = init_befor_main();

int main()
{
    std::cout << "This is main function.\n" << endl;
	return 0;
}

输出如下:

ClassInit() constructor
init_befor_main()
This is main function.

ClassInit() destructor

二、利用pragma data_seg(“.CRT$XIU”)

CRTInit函数中会做一些初始化工作,包括C库、C的初始化函数、C++库、C++的初始化函数等。C和C++分别有一张表来保存初始化函数指针,每个表又会使用2个指针来明确范围。在初始化过程中,__CRTInit函数会一次调用这两个表中的函数,所以如果我们能把要执行的函数放在这两个表中,那么就可以达到在main之前执行代码的目的了。
C初始化函数表的范围是:[ __xi_a, __xi_a ]
C++初始化函数表的范围是:[ __xc_a, __xc_z]

我们在具体执行的时候,通过定义特殊的段名称“.CRT X I U ”和“ . C R T XIU”和“.CRT XIU“.CRTXCU”,把要执行的函数放在段中。
链接器就会形成如下的C初始化函数表:
[__xi_a, …, before1(xiu), …, __xi_z]
以及C++初始化函数表:
[__xc_a, …, before2(xcu), …, __xc_z]

示例代码

#include <iostream>
#include <stdio.h>
using std::cout;
using std::endl;

int before_main(void)
{
	printf("before main!\n");
	return 0;
}

typedef int init_func();

#pragma data_seg(".CRT$XIU")
static init_func *before[] = { before_main };
#pragma data_seg()

int main()
{
    std::cout << "This is main function.\n" << endl;
	return 0;
}

输出结果

需要注意:通过 pragma data_seg(“.CRT$XIU”) 方式,会比全局类对象或者变量先执行。

before main!
This is main function.

三、MinGW编译环境

在Linux环境的C编程中,可以利用__attribute关键字定义constructor和destructor,其中前者会在main函数之前执行,后者会在main函数之后执行。

#include <QCoreApplication>
#include <stdio.h>

__attribute((constructor)) void run_before_main()
{
    printf("run before main!\n");
}

__attribute((destructor)) void run_after_main()
{
    printf("run after main!\n");
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    printf("this is main function.\n");
    return 0;

    return a.exec();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 如何让代码在main()函数之前或者之后执行 的相关文章

  • 单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动

    直流电机 xff08 direct current machine xff09 能将直流电能转换成机械能 xff08 直流电动机 xff09 或将机械能转换成直流电能 xff08 直流发电机 xff09 的旋转电机 它是能实现直流电能和机械
  • 【一文弄懂】张正友标定法-完整学习笔记-从原理到实战

    张正友标定法 完整学习笔记 从原理到实战 文章目录 张正友标定法 完整学习笔记 从原理到实战 xff08 零 xff09 前言 xff1a 1 为什么需要标定 xff1f 2 相机标定的已知条件和待求解是什么 xff1f 标定前的已知条件
  • realsense ——SR300 相机使用小记

    环境搭建相关的参考资料挺多的 xff0c 这里就不多说了 这里记一些相关的api 算了 xff0c 还是给出自己的配置记录吧https blog csdn net hehehetanchaow article details 1057958
  • kubeadm安装部署Kubernetes(k8s)与部署 Dashboard web_UI(附Kubernetes安装脚本)

    前言 Kubernetes作为容器编排工具 xff0c 简化容器管理 xff0c 提升工作效率而颇受青睐 很多新手部署Kubernetes由于 科学上网 问题举步维艰 xff0c 本文以实战经验详解kubeadm不用 科学上网 部署Kube
  • 开源飞控资料

    四轴开源资料 http merafour blog 163 com blog m 61 0 amp t 61 1 amp c 61 fks 08406908208008307008408308409508608708806608408408
  • 深度学习视频数据集(动作识别):UCF-101

    UCF 101 官网 xff1a https www crcv ucf edu research data sets ucf101 网盘 xff1a 链接 xff1a https pan baidu com s 1RsJuykWyUlQ4
  • 视频分析模型(行为识别):C3D

    C3D 文章目录 C3D1 简介1 1 背景1 2 C3D特点1 3 视频描述符1 4 C3D的结果 2 架构2 1 工作流程2 2 网络结构2 3 3D卷积和池化2 4 kernel 的时间深度 3 可视化3 1 特征图3 2 特征嵌入
  • OpenCV下车牌定位算法实现代码 (二)

    前面介绍了用OpenCV的squares实例定位车牌的算法 xff0c 效果不是很理想 车牌定位的方法有很多种 xff0c 这里我们从汽车图像的纹理特征入手 xff0c 找出车牌不同于背景的特征是车牌定位的关键 观察多幅汽车图片我们会发现车
  • 旷视张祥雨:神经网络架构设计新思路

    点击上方 CVer xff0c 选择加 34 星标 34 置顶 重磅干货 xff0c 第一时间送达 本文转载自 xff1a AI科技评论 作者 蒋宝尚 编辑 青暮 深度学习模型在很多任务上都取得了不错的效果 xff0c 但调参却是一项非常痛
  • 发现三本不错的讲解数据存储的书

    研究数据存储 xff0c 没有很多现成的东西 xff0c 但是可以参考数据库系统的存储实现的内容 xff0c 发现三本书 xff0c 觉得值得一读 数据库系统全书 http www china pub com computers commo
  • Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, 4

    处理Failed to get convolution algorithm This is probably because cuDNN failed to initialize so try looking to see if a war
  • 字符型设备驱动程序--gpio 驱动实例

    概述 xff1a 字符设备驱动程序 xff1a 是按照字符设备要求完成的由操作系统调用的代码 重点理解以下内容 1 驱动是写给操作系统的代码 xff0c 它不是直接给用户层程序调用的 xff0c 而是给系统调用的 2 所以驱动要向系统注册
  • 协议栈

    协议栈 协议栈是指网络中各层协议的总和 xff0c 其形象的反映了一个网络中数据传输的过程 xff1a 由上层协议到底层协议 xff0c 再由底层协议到上层协议 使用最广泛的是英特网协议栈 xff0c 由上到下的协议分别是 xff1a 应用
  • 再见2011,你好,2012。

    不会写文章 xff0c 这个算是对自己的一个总结吧 xff0c 毕业一年半了 xff0c 从事嵌入式也有一年半了 xff0c 总觉得自己连入门都谈不上 xff0c 整天都看上去很忙 xff0c 有时候确实有一大堆的事情要做 xff0c 但是
  • matlab读取realsense bag文件数据

    代码参考 xff1a https dev intelrealsense com docs matlab wrapper 本示例的功能 xff1a matlab代码 xff1a 给出bag文件路径 xff0c 显示realsense相机型号
  • vncserver:command not found

    Question Solution 1 使用root用户登录 xff0c 运行 yum install tigervnc server 2 使用其他用户 eg opuser 登录 xff0c 启动vncserver xff0c 设置pass
  • CKF MCSCKF UKF EKF滤波性能对比

    CKF MCSCKF UKF EKF滤波性能对比 在非线性滤波中 比较了CKF MCSCKF UKF EKF 几种非线性滤波的性能 用MATLAB进行仿真 八维非线性滤波中 CKF MCSCKF 比较稳定 EKF UKF 表现不好 MATL
  • 自制串口调试助手

    span class token keyword using span span class token namespace System span span class token punctuation span span class
  • 文件描述符和套接字

    文件描述符 xff1a 文件描述符在形式上是一个非负整数 实际上 xff0c 它是一个索引值 xff0c 指向内核为每一个进程所维护的该进程打开文件的记录表 当程序打开一个现有文件或者创建一个新文件时 xff0c 内核向进程返回一个文件描述
  • Papers with Code 2020 全年回顾(顶流论文+顶流代码+Benchmarks)

    点击上方 CVer xff0c 选择加 34 星标 34 置顶 重磅干货 xff0c 第一时间送达 本文转载自 xff1a AI公园 作者 xff1a Ross Taylor 编译 xff1a ronghuaiyang 导读 2020年Pa

随机推荐

  • Nginx 多进程模型是如何实现高并发的?

    进程数与并发数不存在很直接的关系 这取决取server采用的工作方式 如果一个server采用一个进程负责一个request的方式 xff0c 那么进程数就是并发数 那么显而易见的 xff0c 就是会有很多进程在等待中 等什么 xff1f
  • 剑指offer 矩阵中的路径

    题目描述 请设计一个函数 xff0c 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一个格子开始 xff0c 每一步可以在矩阵中向左 xff0c 向右 xff0c 向上 xff0c 向下移动一个格子 如果
  • QGC二次开发---自定义MAVLink消息

    MAVLink库下载 下载网站https github com mavlink mavlink 可以通过git工具 xff0c 在存放文件夹下打开git工具 xff0c 输入命令 xff1a git clone https github c
  • 视差图(Disparity)三维重投影得到特征点的三维空间坐标的2种方法

    文章目录 前提方法1 perspectiveTransform 方法2 reprojectimageto3d PS参考 前提 1 使用BM或者SGBM算法计算得到了双目图像的合适左右视差图 xff1b 2 使用立体校正函数stereoRec
  • ubuntu查看内存使用情况

    ubuntu下单独查看内存使用情况 free m free默认输出的单位是kb xff0c m表示以M为单位 查看CPU内存使用情况 top 查看GPU内存使用情况 nvidia smi
  • QT 如何调节Windows系统音量大小

    在平时日常工作中 xff0c 我们切换输入法的方式一般会通过键盘组合按键来进行切换的 xff0c 那么作为程序员 xff0c 当然可以通过发送键盘消息事件来实现输入法的切换 同样的道理 xff0c 我们也可以通过发送键盘事件实现麦克风音量或
  • QT 九宫格绘图(QSS方式)

    什么是九宫格方式绘图 xff1f 顾名思义 xff0c 就是把一个方块分割成 9 个部分 xff0c 如图所示 xff1a 九宫格绘图的原理就是把背景图分割成 9 个部分 xff0c 绘制时 xff1a 四个角 xff08 1 3 7 9
  • QT QTimeLine 用法小结

    QTimeLine简述 它最常用于通过周期性调用槽来动画化GUI控件 您可以通过将时间线的持续时间 xff08 以毫秒为单位 xff09 传递给QTimeLine的构造函数来构造时间线 时间线的持续时间描述动画将运行多长时间 然后通过调用s
  • QT 秒/毫秒 转 时分秒

    在日常开发时 xff0c 经常会遇到计算剩余进度或者剩余时间的问题 xff0c 比如计算剩余下载时间等等 本篇文章旨在提供几个常用的转换方式供各位参考 1 秒转时分秒 xff08 方法壹 xff09 QString span class t
  • QT 如何实现 半透明的 圆角 矩形 窗口

    在日常使用的软件里面 xff0c 有些软件提示用户时 xff0c 经常会发现有些提示窗口是半透明的 那么如何实现一个可拖动的 半透明 圆角矩形窗口呢 xff1f 整体思路 xff1a 将窗口本身设置为透明 xff0c 然后通过qss或者绘图
  • 小哥质疑谷歌顶会CV论文有错!并且拿出了复现代码来证明

    点击上方 CVer xff0c 选择加 34 星标 34 置顶 重磅干货 xff0c 第一时间送达 萧箫 发自 凹非寺 来源 xff1a 量子位 xff08 QbitAI xff09 景色很好看 xff0c 可是手机相机分辨率太低 xff0
  • QT 如何只允许打开一个 chm 文档

    chm文档 xff0c 大家都不会陌生 xff0c 很多软件的帮助文档就是chm格式的 我们自己在开发程序的时候 xff0c 也需要对外提供帮助文档 xff0c 为了方便用户 xff0c 经常在软件中就可以打开帮助文档 xff0c 那么如何
  • QT 如何把外部程序嵌入到QT界面

    一个奇怪但又合乎现实需要的需求 xff0c 就是把外部程序嵌入到本窗口内 xff0c 实现外部程序在本窗口的显示 可能外部程序是由其他人开发的 xff0c 但是想 拿来 作为内部使用 xff0c 于是乎想把外部程序嵌入到本程序窗口内 xff
  • QT 如何去除QListView选中item后的虚线框

    在使用QListView或者QListWidget时 xff0c 如果选中其item xff0c 会发现边框会出现虚线框 xff0c 这并不美观 xff01 所以 xff0c 我们需要去掉选中后的虚线框 在查阅各路大神的实现方式后 xff0
  • QT QCompleter 用法小结

    1 有何用处 QCompleter类提供基于项模型的补全功能 您可以使用QCompleter在任何Qt小部件 xff08 如QLineEdit和QComboBox xff09 中提供自动补全 当用户开始键入单词时 xff0c QComple
  • QT 关于全屏 与 退出全屏

    在某些场景 xff08 比如说 xff1a 车机系统 医疗仪器等 xff09 可能需要确保软件的全屏显示 xff0c 本次探讨的是如何实现全屏与退出全屏 实现全屏的几种方式 span class token operator lt span
  • QT 如何设置 QCompleter 样式

    在使用QCompleter xff0c 一般都会面临两个问题 xff1a 1 如何设置Completer的行高 xff1b 2 如何设置Completer的样式 本文将一次为你解答 xff0c 顺便讲讲ComboBox设置Completer
  • QT 如何知道用户点击 QTextBrowser 中的具体链接地址

    在通过鼠标点击 QTextBrowser 中的链接地址时 xff0c 如果是希望使用外部浏览器打开链接地址 xff0c 只需要添加一行代码 ui gt textBrowser gt setOpenExternalLinks true 但如果
  • QT 常用控件类型命名参考

    规范的定义 规范 xff0c 有名词 动词 代词等词性 意指符合逻辑 xff0c 客观 真实 全面 完整 准确 及时 xff0c 达标 明文规定或约定俗成的标准 如 xff1a 道德规范 技术规范等 或是指按照既定标准 规范的要求进行操作
  • C++ 如何让代码在main()函数之前或者之后执行

    程序最早执行的函数其实并不是main xff0c 在main函数之前会有一系列初始化的操作 xff08 通常是由链接器等完成的 xff09 比如在windows中 xff0c 这个函数是mainCRTStartup xff0c 这个函数是链