Предположим, у меня есть следующие файлы:
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