我什么时候需要在main()之前或之后运行函数?

时间:2014-01-26 05:31:39

标签: c gcc main

GCC支持construtors/destructor函数,这些函数支持在main()之前或之后运行函数:

  

constructor属性导致在执行main()之前自动调用该函数。同样,destructor属性会导致在main()完成或调用exit()后自动调用该函数。具有这些属性的函数对于初始化在程序执行期间隐式使用的数据非常有用。

以下是GeeksforGeeks的示例。

使用此功能的正确方法是什么时候?特别是在main()之前调用的函数,如果我们将它放在main()的开头有什么区别?

4 个答案:

答案 0 :(得分:2)

这样的构造函数和析构函数在编写库时非常有用。

如果您正在编写需要初始化的库,那么您必须提供初始化功能。但是,您如何确保它在您的任何其他库函数之前运行?使用图书馆时必须记住要调用它,这很容易让人忘记。

自动完成初始化的一种方法是将函数标记为构造函数。

另请参阅:How to initialize a shared library on Linux

答案 1 :(得分:1)

假设你有一个全局结构,并且你想在启动程序之前将内存初始化为结构,你可以把它放在构造函数中,因为它在main()之前调用。

同样,如果你想在程序结束之前释放任何现有的内存,你可以在析构函数中这样做。

答案 2 :(得分:1)

对于大多数情况,没有区别。你想用全局变量,单例,内存等做的一切,理论上你可以在main()中使用普通的静态初始化器。

这个稍微适用的主要场景是跨平台项目,您希望将大部分公共代码保留在main中,但是在某些平台上,主要是嵌入式代码,您希望复制其他操作系统正在执行的操作在main之前 - 设置环境变量,将标准文件描述符(stdin / stdout / stderr)连接到系统上的自定义描述符,分配自己的自定义内存管理器 - 例如,分配自己的堆栈以运行main(),依此类推。 / p>

答案 3 :(得分:1)

从我的观点来看,模块构造函数在制作共享模块时有其意义。

共享模块没有特定的初始化例程(Windows上有DllMain,但我有其局限性。)

例如,Asterisk PBX滥用构造函数因为强烈基于模块,它在编译时在每个模块上注入构造函数。 这个构造函数在dlload()上被调用,并告诉星号核心模块是否已正确加载,允许它调用模块上的特定函数。