首页 > 编程语言 >C++如何在main函数之前执行自定义操作

C++如何在main函数之前执行自定义操作

时间:2024-09-19 12:52:22浏览次数:3  
标签:__ 函数 自定义 int attribute C++ Func main

目录

一.前言

我们知道C++程序在main函数运行之前会先执行一些动作,比如一系列初始化动作,那么我们怎么让C++程序在main函数运行前执行一些自定义函数呢,这篇文章里会介绍一些方法。

二.利用全局变量的初始化机制

我们知道全局变量的初始化是在main函数运行之前,所以就可以利用这一点来实现。

1.利用构造函数

看代码

//main.cpp

class Demo
{
public:
	Demo(void)
	{
		//执行动作
	}

	~Demo(void) noexcept = default;
};

Demo demo;

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中由于demo是全局变量,所以demo的初始化会在main函数运行之前。demo的初始化动作会调用构造函数,这样就可以在构造函数中做一些想要在main函数运行之前执行的动作了。

2.用函数结果对全局变量赋值

看代码

//main.cpp

int Func(void)
{
	//执行动作

	return 0;
}

int i = Func();

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中由于i是全局变量,所以i的初始化会在main函数运行之前。demo的初始化动作需要调用函数Func(),这样就可以在Func()函数中做一些想要在main函数运行之前执行的动作了。

三.gcc可以利用__attribute__

看代码

//main.cpp

__attribute__((constructor)) void Func(void)
{
	//执行动作
}

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中利用__attribute__设置函数Func()的属性,也可以让函数Func()在main函数之前执行。

四.其他

1.利用全局变量的初始化和利用__attribute__设置函数属性这两种方式,又是哪种会更先执行呢,有兴趣的话可以简单测试一下。

2.利用__attribute__设置函数属性的方法适用于gcc编译器,对于vs默认的msvc编译器不适用,但是msvc编译器可以利用#pragma的方式。

3.如果是想自定义在main函数运行之后的动作要怎么做呢,对于gcc还是可以利用__attribute__设置函数属性的方式来实现,看代码

//main.cpp

__attribute__((destructor)) void Func(void)
{
    //执行动作
}

int main(int argc, char *argv[])
{
    //执行main函数动作

    return 0;
}

这个示例中Func()函数就可以在main运行之后执行。同样的也可以利用其他方法,有兴趣的话也可以研究一下。

标签:__,函数,自定义,int,attribute,C++,Func,main
From: https://blog.csdn.net/2401_85919417/article/details/142284056

相关文章

  • C++ 面试模拟02
    第一部分:基础知识什么是拷贝构造函数和赋值运算符?它们之间有什么区别?在C++中,const关键字的作用是什么?有哪些常见用法?C++中的内存管理机制是怎样的?如何避免内存泄漏?虚函数(virtualfunction)的作用是什么?虚函数表(vtable)是如何工作的?第二部分:面向对象编程什么是多态性?C++中......
  • C++ 逆向之 main 函数的查找
    在整个程序的逆向分析过程中,寻找main函数是逆向分析过程的第一步,程序的主要逻辑从这里展开。这里面涉及到两个概念:用户入口(UserEntryPoint)和应用程序入口(ApplicationEntryPoint)。用户入口用户入口是开发者编写的用于程序开始的函数。对于大多数C/C++程序而言,这个入......
  • 小程序上传代码出错,Error: 代码包大小超过限制,main package source size 2662KB...
    上传代码问题uniapp小程序上传代码时提示:Error:代码包大小超过限制,mainpackagesourcesize2662KB...解决方案使用HbuilderX发行,打开微信开发者工具,再次上传代码可解决此问题填写小程序appid与小程序名称: 执行发行时遇到的问题此应用DCloudappid......
  • vim matchit 自定义配对关键字之间的跳转
    vim因其强大的扩展性一直深受linux程序员的喜爱,最近在用vim写verilog的时候,由于一个逻辑块中的beginend较多,常常会多写或者漏掉匹配关键字,很是苦恼,于是寻找匹配关键字间跳转的方法,发现matchit可以用%在关键字之间实现跳转,还可以自定义更多的关键字,相当方便。以下正片:1、安装ma......
  • Unity自定义图片数字TextMeshPro
    本文转载自https://www.cnblogs.com/sailJs/p/181689221、首先要有一张包含了图片字的图集,每个图片字一个Spirte 2、然后右键-> 创建创建好的TMP_SpriteAsset 3、编辑SpriteCharacterTable调整顺序,将index和图片数字对上修改下Unicode值(默认都是0xFFFE),比如9的Un......
  • vue3自定义指令,全局注册
    1这是directive.js注册的的importtype{Directive,DirectiveBinding}from"vue";importuseUserStorefrom"@/stores/user";import{createPinia}from"pinia";constuserStore=useUserStore(createPinia());//buttonList:["......
  • c++1095: 时间间隔(多实例测试) (字符串和字符以及数字的转换)
    问题描述:题目描述从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。要求程序定义如下两个函数,并在main()中调用这两个函数实现相应的功能/*三个形参分别为为用于表示一个时间点的时、分、秒,函数返回对应的秒。*/int HmsToS(int......
  • C++-练习-41
    题目:编写一个程序,它打开一个文本文件,逐个字符地读取该文件,知道到达文件末尾,然后指出该文件中包含多少个字符。(包含空格)源代码:#include<iostream>#include<fstream>intmain(){ usingnamespacestd; charch; intch_num=0; ifstreamfin; fin.open("people.......
  • C++-练习-42
    题目:编写一个程序,记录捐献给"维护合法权利团队"的资金。该程序要求用户输入捐献者数目,然后要求用户输入每一个捐献者的姓名和款项。这些信息被存在一个动态分配的结构数组中。每个结构有两个成员:用来存储姓名的字符数组和用力啊存储款项的double成员。读取所有的数据后,程序将......
  • 【信创】Linux上如何创建和管理自定义的 systemd 服务 _ 统信 _ 麒麟 _ 方德
    原文链接:【信创】Linux上如何创建和管理自定义的systemd服务|统信|麒麟|方德Hello,大家好啊!今天给大家带来一篇关于在Linux系统上如何创建和管理自己的systemd服务的文章。systemd是Linux系统中的初始化系统和服务管理器,它为系统提供了强大的服务管理功能。通过创建和......