Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在对象构造函数之前调用GCC__属性__((构造函数))_C++_Gcc - Fatal编程技术网

C++ 在对象构造函数之前调用GCC__属性__((构造函数))

C++ 在对象构造函数之前调用GCC__属性__((构造函数)),c++,gcc,C++,Gcc,在我的共享库中,我需要将一些数据加载到无序的_映射中,并尝试在标记为_uu属性uu((构造函数))的函数中进行加载。但是我在每次地图操作中都得到了SIGFPE。在研究stackoverflow之后,我发现这意味着无序的_映射未初始化。这对我来说是非常出乎意料和不可理解的,因为,一目了然,它违反了C++契约。任何人都可以帮助我在运行构造函数之后如何运行这个方法?下面是一个使用我自己的构造函数的工作示例,它表明它没有被调用: #include <stdio.h> class Ala {

在我的共享库中,我需要将一些数据加载到无序的_映射中,并尝试在标记为_uu属性uu((构造函数))的函数中进行加载。但是我在每次地图操作中都得到了SIGFPE。在研究stackoverflow之后,我发现这意味着无序的_映射未初始化。这对我来说是非常出乎意料和不可理解的,因为,一目了然,它违反了C++契约。任何人都可以帮助我在运行构造函数之后如何运行这个方法?下面是一个使用我自己的构造函数的工作示例,它表明它没有被调用:

#include <stdio.h>

class Ala {
    int i;
public:
    Ala() {
        printf("constructor called\n");
        i = 3;
    }

    int getI() {
        return i;
    }
};

Ala a;

__attribute__((constructor))
static void initialize_shared_library() {
    printf("initializing shared library\n");
    printf("a.i=%d\n", a.getI());
    printf("end of initialization of the shared library\n");
}
但是如果一个试图使用STD::CUT代替PrtFS,那么它会立即进入StError(因为流的构造器没有运行)

< P> <代码>属性>((构造函数))< /C>是编译器扩展,所以你离开了标准C++的领域。看起来GCC的构造函数是在全局初始化之前运行的

修复它的方法是使用另一个香草C++构造,例如,通过与其他全局定义相同的TU定义初始化的全局对象:

Ala a;

static void initialize_shared_library() {
    printf("initializing shared library\n");
    printf("a.i=%d\n", a.getI());
    printf("end of initialization of the shared library\n");
}

static int const do_init = (initialize_shared_library(), 0);

如果你想在<代码> > <代码>之后运行一些东西,有几种方法可以做到这一点而不留下标准C++;这里有一个:

struct Ala2 : Ala
{
    Ala2()
    {
         // your init code here
    }
};

Ala2 a;

如果使用返回静态局部变量的函数,则该变量将在第一次调用该函数时初始化。 见:


正如其他人所说,通常最好将所有初始化过程封装在一个对象中,让构造函数为您完成工作(构造函数的主体在类的所有成员初始化后执行).

您可以尝试使用语法,并为
a
指定一个比此函数更低的数字。您需要指定优先级,以确保构造函数的顺序正确。最好远离编译器扩展,使用一个建议的香草C++结构。“它违反C++契约”:当然它违反C++契约;您使用了编译器扩展,这意味着它不会像标准C++那样运行。您需要阅读扩展的文档以了解它的行为。@MartinBonner不幸的是,文档似乎非常陈旧,它没有涵盖诸如与没有该属性的全局对象的交互之类的内容。我认为这里发生的事情的顺序是未定义的。它显然没有被记录在案。这是一个旧线程,但请看:可以将其表述为
static struct init{init(){/*do init*/}forceu init-这避免了略微复杂的逗号运算符。
struct Ala2 : Ala
{
    Ala2()
    {
         // your init code here
    }
};

Ala2 a;
struct Ala {
   // Your code here
   static Ala& get_singleton();
};

Ala& Ala::get_singleton() {
   static Ala singleton;
   return singleton;
}

static void initialize_shared_library() {
    Ala& a = get_singleton();
    printf("initializing shared library\n");
    printf("a.i=%d\n", a.getI());
    printf("end of initialization of the shared library\n");
}