C++ 是否存在一个在main()主函数之前就执行的函数? 这个可以有!

简介: C++ 是否存在一个在main()主函数之前就执行的函数? 这个可以有!

一般地,大家都知道的常规:


   C/C++ 程序是从main()函数开始执行的

   main()函数有参数和返回值

   main()函数是操作系统调用的函数

   操作系统总是将main()函数作为应用程序的开始

   操作系统将main()函数的返回值作为程序的退出状态


那究竟有否能在main()主函数之前执行的函数呢?


答案:有!  


有些编译器支持关键字 attribute,能指定在 main 之前 (constructor) 、main 之后 (destructor) 分别执行一个函数。


 

__attribute__((constructor)) void init()    // 在main()之前工作
    __attribute__((destructor))  void exit()    // 在main()之后工作



但不是所有的编译器都支持相关功能关键字扩展,以下代码可在TDM-GCC 4.9.2 或 gcc7.5.0 上通过无错无警告编译:

#include <iostream>
using namespace std;
int i;
__attribute__((constructor)) void init()
{
    cout << __FUNCTION__ << endl;
    cout << "构造函数:初始化工作" << endl;
    i = 323;
}
__attribute__((destructor)) void exit()
{
    cout << __FUNCTION__ << endl;
    cout << "析构函数:退出程序 bye!" << endl;
}
int main()
{
    cout << __FUNCTION__ << endl;
    cout << "main()主函数:执行事务\n";
    cout << "输出变量 i = " << i << endl;
    return 0;
}



执行结果:


   init

   构造函数:初始化工作

   main

   main()主函数:执行事务

   输出变量 i = 323

   exit

   析构函数:退出程序 bye!

   --------------------------------

   Process exited after 0.4433 seconds with return value 0

   请按任意键继续. . .



目录
相关文章
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
185 0
|
9月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
488 6
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
523 6
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
144 3
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
310 0
C++ 多线程之线程管理函数
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
122 3
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
2415 1
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
199 1
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
221 0
C++入门6——模板(泛型编程、函数模板、类模板)