Как входные файлы заказа влияют на связь и статическую инициализацию в GCC? - PullRequest
5 голосов
/ 07 февраля 2012

Предположим, у меня есть следующие файлы:

lib / Ah

#ifndef A_H
#define A_H

#include <vector>

class A {
        public:
                static int add( int x );
                static int size();
        private:
                static std::vector<int> vec;
};

#endif

lib / A.cpp

#include "A.h"

std::vector<int> A::vec;

int A::add( int x ) {
        vec.push_back( x );
        return vec.size();
}

int A::size() { 
        return vec.size();
}

lib / Bh

#ifndef B_H
#define B_H

class B {
        public:
                static const int val = 42;
};

#endif

lib / B.cpp

#include "B.h"
#include "A.h"

int tempvar = A::add( B::val );

и наконец: main: cpp

#include <iostream>
#include "lib/A.h"
#include "lib/B.h"

int main() {
        std::cout << A::size() << std::endl;
}

Результат выполнения этого кода зависит от того, как я его скомпилирую:

g++ main.cpp lib/A.cpp lib/B.cpp -o nolibAB
./nolibAB

печатает "1"

g++ main.cpp lib/B.cpp lib/A.cpp -o nolibBA
./nolibBA

печатает "0"

g++ -c lib/A.cpp lib/B.cpp
ar rvs lib.a A.o B.o
g++ main.cpp lib.a
./a.out

печатает "0" (независимо от того, я переупорядочиваю A.cpp и B.cpp)

Может кто-нибудь сказать мне причину, что это так?

РЕДАКТИРОВАТЬ: я использую gcc 4.6.1

1 Ответ

1 голос
/ 07 февраля 2012

Это не определено стандартом.Проще говоря: вы не должны полагаться на инициализацию глобальных переменных в определенном порядке.

Related: Проблема статического порядка инициализации в C ++

...