最近在看代码的时候碰到一个问题,这项目中有一个全局变量,里面有许多系统用的属性。但是一直找不到它在哪里被赋值。后来跟了代码才发现在系统开始之前已经有一个constructor将这个东西初始化好。
GCC可以给函数若干属性,其中construction就是其中一个。具体有哪些属性,可以看GCC的文档。
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
在上面文档中有对于constructor与destructor的描述:
引用
constructor
destructor
constructor (priority)
destructor (priority)
The constructor attribute causes the function to be called automatically before execution enters main (). Similarly, the destructor attribute causes the function to be called automatically after main () has completed or exit () has been called. Functions with these attributes are useful for initializing data that will be used implicitly during the execution of the program.
You may provide an optional integer priority to control the order in which constructor and destructor functions are run. A constructor with a smaller priority number runs before a constructor with a larger priority number; the opposite relationship holds for destructors. So, if you have a constructor that allocates a resource and a destructor that deallocates the same resource, both functions typically have the same priority. The priorities for constructor and destructor functions are the same as those specified for namespace-scope C++ objects (see C++ Attributes).
These attributes are not currently implemented for Objective-C.
大致意思就是,可以给一个函数赋予constructor或destructor,其中constructor在main开始运行之前被调用,destructor在main函数结束后被调用。如果有多个constructor或destructor,可以给每个constructor或destructor赋予优先级,对于constructor,优先级数值越小,运行越早。destructor则相反。
下面是一个例子:
#include <stdio.h>
__attribute__((constructor(101))) void foo()
{
printf("in constructor of foo\n");
}
__attribute__((constructor(102))) void foo1()
{
printf("in constructor of foo1\n");
}
__attribute__((destructor)) void bar()
{
printf("in constructor of bar\n");
}
int main()
{
printf("in main\n");
return 0;
}
运行的结果为:
in constructor of foo
in constructor of foo1
in main
in constructor of bar
分享到:
相关推荐
C++语言是支持OOP特性的编程语言之一,它允许我们通过类(Class)和对象(Object)来实现面向对象的思想。 在C++中,类是定义对象的蓝图,它包含了数据成员(属性)和成员函数(行为)。数据成员代表对象的状态,而...
C++语言继承了C语言的优点,并加入了面向对象编程的概念,成为了一种功能强大且灵活的程序设计语言。 1.1 C++语言的特点 * 静态类型:C++语言是一种静态类型的语言,变量的数据类型在编译时确定。 * 编译型:C++...
C#(发音为“C Sharp”)是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序、网络服务和游戏。本教程旨在提供全面的C#语言学习指南,覆盖从基础到高级的各种主题。 一、C#语言基础 1. 变量与...
3. **构造函数与析构函数**:C++中的构造函数和析构函数是用于初始化和清理对象的,而在Delphi中,这些功能由构造函数(Constructor)和析构函数(Destructor)完成,它们的语法略有不同。 4. **异常处理**:C++...
此外,还讲解了构造函数(constructor)和析构函数(destructor)的应用,以理解类的生命周期。 2. 第37讲:继承与多态 本讲深入探讨了继承(inheritance)的概念,它是OOP的三大特性之一。何教授解释了如何通过...
模拟试题2013年计算机二级考试C++模拟试题十及参考答案 本资源总结了2013年计算机二级...该程序的输出结果为Constructor2 Constructor1 i=0 i=10 Destructor,因为CSample类的构造函数和析构函数都被正确地调用了。
2. **构造函数和析构函数(Constructor & Destructor)**:构造函数在创建对象时自动调用,用于初始化对象的成员变量;析构函数在对象生命周期结束时调用,用于清理资源。在C++中,这两个函数的名字分别与类名相同,且...
C#(发音为"C Sharp")是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序、Web应用以及移动应用等。C#是.NET框架的一部分,它在设计时考虑了简洁性、类型安全性和性能等因素,使得程序员可以...
在类中,你需要了解成员变量(data members)和成员函数(member functions),以及如何通过构造函数(constructor)和析构函数(destructor)来管理对象的生命周期。封装是将数据和操作数据的方法结合在一起,提供...
- extern“C”:用于C++中调用C语言编写的函数。 ##### 2.4 操作符重载 - 介绍操作符重载的概念及其用法。 ##### 2.5 默认参数 - 示例:展示如何为函数设置默认参数。 - 规则:讲解设置和使用默认参数的规则。 ##...
- **构造器和析构器(Constructor and Destructor)**:用于初始化和清理对象。 #### 九、Interface Builder集成 Interface Builder允许开发者通过图形界面来设计用户界面,而不是手动编写代码。 - **界面设计**:...
6. **构造函数和析构函数(Constructor and Destructor)**:构造函数是特殊类型的成员函数,用于在创建对象时初始化数据成员。析构函数则在对象生命周期结束时执行,用于清理资源。这两个函数的名字与类名相同,...
构造器(Constructor)和析构器(Destructor)分别用于创建和销毁对象。C++支持拷贝构造函数,用于创建一个新的对象作为现有对象的副本,同时涉及到深拷贝与浅拷贝的区别。this指针是一个特殊的指针,用于指向调用...
在C++编程语言中,构造函数和析构函数是类的两种特殊成员函数,它们在对象的生命周期中扮演着至关重要的角色。本章主要讲解了关于C++中构造函数和析构函数的基本概念、用途以及相关特性。 首先,构造函数...
在C编程语言中,矩阵操作是一项重要的任务,特别是在科学计算、图像处理和机器学习等领域。这个"矩阵类库源代码"提供了一种高效且灵活的方式来处理矩阵,使得开发者能够便捷地进行矩阵的创建、初始化、读取、修改...
7. **ex07b**:可能讲解了构造函数和析构函数(Constructor and Destructor)的使用,它们在类对象的生命周期管理中扮演关键角色。 8. **ex10d**:可能涉及了指针和引用(Pointers and References)的运用,这些都...
在类与对象(Class & Object)部分,王老师讲解了栈的声明与定义、构造器(Constructor)的定义及意义、参数初始化表以及析造器(Destructor)的定义、意义和对象销毁时期。多文件编程、拷贝构造(Copy Constructor...
7. 构造函数与析构函数(Constructor and Destructor):构造函数在对象创建时自动调用,用于初始化对象的状态;析构函数在对象生命周期结束时自动调用,用于清理资源。这两者对于资源管理至关重要。 8. 继承...
封装器的作用是提供一个接口层,使得C代码能够以目标语言可识别的方式暴露出来。例如,如果目标语言是C#,则封装器可能需要使用C/C++ Interop技术。 ##### 创建定义文件 创建一个定义文件(.def),用于描述DLL的...