__attribute__((constructor)) 究竟是如何工作的?

新手上路,请多包涵

似乎很清楚它应该进行设置。

  1. 具体什么时候运行?
  2. 为什么有两个括号?
  3. __attribute__ 是一个函数吗?宏?句法?
  4. 这在 C 中有效吗? C++?
  5. 它使用的功能是否需要是静态的?
  6. __attribute__((destructor)) 什么时候运行?

Objective-C 中的示例

 __attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

原文由 Casebash 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答
  1. 它在加载共享库时运行,通常是在程序启动期间。
  2. 这就是所有 GCC 属性的方式;大概是为了将它们与函数调用区分开来。
  3. GCC 特定的语法。
  4. 是的,这适用于 C 和 C++。
  5. 不,函数不需要是静态的。
  6. 析构函数在共享库卸载时运行,通常是在程序退出时。

因此,构造函数和析构函数的工作方式是共享对象文件包含特殊部分(ELF 上的 .ctors 和 .dtors),其中包含对分别标记有构造函数和析构函数属性的函数的引用。当库被加载/卸载时,动态加载程序(ld.so 或 somesuch)检查这些部分是否存在,如果存在,则调用其中引用的函数。

想一想,普通静态链接器中可能有一些类似的魔法,因此无论用户选择静态链接还是动态链接,都可以在启动/关闭时运行相同的代码。

原文由 janneb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题