LINUX.ORG.RU

бага в компиляторе ????? :(


0

0

hi all. написал прогу а она не работает...

// file f1.h /////////////////////////
#include <vector>

using namespace std;

class c1
{
public:
c1() {};
static vector<c1*> v2;
static int reg(c1*);
};
////////////////////////////////////

// file f1.cpp ////////////////////
#include "f1.h"

vector<c1*> c1::v2;
////////////////////////////////////

// file f2.cpp ////////////////////
#include <f1.h>
#include <stdio.h>

int c1::reg(c1* v)
{
v2.push_back(v);
printf("registration size = %d\n", v2.size());
}

c1 o1;
static int a = c1::reg( &o1 );

int main(int argc, char** argv)
{
printf("entered %d\n", c1::v2.size());
return 0;
}
////////////////////////////////////

выход программы такой:
registration size = 1
entered 0

а должен быть такой:
registration size = 1
entered 1

помогите, люди добрые... научите где собака порылась...
компайлер GCC 2.95.3 Slackware 7.1

★★

P.S. забыл сказать: если слить f1.cpp и f2.cpp то все работает нормально...

hoopoe ★★
() автор топика

Насколько я знаю, порядок инициализации переменных, которые пихаются в сегмент данных, описанных в разных файлах не определен. Похоже в твоем случае первой инициализируется
static int a = c1::reg( &o1 );
а уже после этого инициализируется
vector<c1*> c1::v2;
С другой стороны v2 должен быть в bss, и инициализация должна возлагаться на загрузчик, а не на сгенерированный код. Не знаю вобщем. Покопай в этом направлении, может и найдешь что нибудь. Если не секрет, зачем это все нужно ?
P.S. И где это люди травку такую берут ?

timur
()

спасибочки, посморю...

hoopoe ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.