gpt4 book ai didi

c++ - GCC 中的 __attribute__((init_priority(X)))

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:25 27 4
gpt4 key购买 nike

我在 GCC 中使用 __attribute__((init_priority(X))) 是这样的:

Type1 __attribute__ ((init_priority (101))) name1 = value1;
Type2 __attribute__ ((init_priority (102))) name2 = value2;

在不同的源文件中。比方说 file1.cpp 和 file2.cpp。如果我在同一个库中使用它,它会按预期工作,name1 在 name2 之前初始化,但如果我在不同的库中使用它,则初始化顺序不是预期的顺序。我在 gcc 文档中读到这应该像我期望的那样在不同的库中工作,以定义初始化的顺序。我使用它的方式有问题吗?你有同样的问题吗?

PS:重构不是解决这个问题的方法,因为我必须从 Visual Studio 移植一个非常大的项目。

最佳答案

gcc 文档 (gcc 4.4) 说:

`init_priority (PRIORITY)'

In Standard C++, objects defined at namespace scope are guaranteed to be initialized in an order in strict accordance with that of their definitions in a given translation unit. No guarantee is made for initializations across translation units. However, GNU C++ allows users to control the order of initialization of objects defined at namespace scope with the `init_priority' attribute by specifying a relative PRIORITY, a constant integral expression currently bounded between 101 and 65535 inclusive. Lower numbers indicate a higher priority.

没有任何迹象表明这如何适用于库,尤其是共享库。我希望静态库 (libxyz.a) 在这方面与单个目标文件一样工作,因为它们只是目标文件的集合,并且文档的措辞表明它可以跨翻译单元工作(即不同的对象文件)。

然而,共享库本身就是有效的可执行文件——在给定的共享库中,初始化是按指定的顺序完成的,但共享库是按动态加载程序指定的顺序整体初始化的,即 liba。 so 根据加载程序的排序标准在 libb.so 之前或之后加载,并且 init_priority 属性不会影响该排序。

关于c++ - GCC 中的 __attribute__((init_priority(X))),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3371968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com