2017-02-17 10 views
0

Мой GCC версии 4.8.5порядок компилятор с GCC 4.8.5

  • POSIX GCC версии 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)

У меня есть два CPP файлов:

  • 1.cpp и файл 2.cpp

пока есть статическая функция в 1.cpp калле . D на файле 2.cpp В большинстве машине, мы хотели бы это:

  • г ++ файле 2.cpp 1.cpp

или это приведет к компиляции ошибки или ошибки во время выполнения

Однако. , В моей машине с gcc 4.8.5, я должен скомпилировать с помощью «g ++ 1.cpp 2.cpp», чтобы сделать его успешным.

Это свойство gcc4.8.5? Или что-то не так на моей мягкой , Или я использовал его неправильно?

============================================================================================================================================ ================

Моя машина centos7 установлена ​​на virtulbox mac. Вот мой код:


1.h

#include <map> 
using namespace std; 

class A { 
    private: 
     A(); 
     static A _instance; 
     map<int, int> test_map; 
    public: 
     static A& get_instance(); 
     static void fun(); 
    }; 

1.cpp

#include <iostream> 

#include "1.h" 

using namespace std; 

A A::_instance; 

A::A() { 
    cout << "A::A()\n"; 
} 

A& A::get_instance() { 
    cout << "A::get_instance()\n"; 
    return A::_instance; 
    // static A instance; 
    // return instance; 
} 

void A::fun() { 
    cout << "A::fun()\n"; 
    get_instance().test_map[1]; 
} 

main.cpp

#include <iostream> 
#include "1.h" 
using namespace std; 

int test() { 
    cout << "test()\n"; 
    A::fun(); 
    return 0; 
} 
int y = test(); 

int main() { 
    cout << "main()\n"; 
    A::fun(); 
} 

В большинстве машины и в том, что я вижу в Интернете, мы должны собрать как этот: г ++ main.cpp 1.cpp

Но в моей машине, я должен составить так: г ++ 1.cpp main.cpp

что случилось с моей машиной или моим gcc?

+0

Можете ли вы привести пример кода и сообщения об ошибках, чтобы прояснить вопрос? Например. «Статическая функция в 1.cpp, вызванная 2.cpp', не имеет смысла (статическая функция не может вызываться за пределами файла, в которой она определена). – yugr

+0

благодарит за ваше мнение, я редактировал вопрос и добавил свой код. Ждем ваших решений. – user6246294

+0

Просьба также предоставить подробную информацию о том, какая ошибка вы видите. Заказ файлов не должен иметь значения вообще, если вы не полагаетесь на неопределенное поведение (например, порядок статических конструкторов). – yugr

ответ

0

Я думаю, что вы столкнулись с static initialization order fiasco, который является классической ошибкой C++. Если вызывается функция инициализации test() в main.cpp до того, как был вызван конструктор для A::_instance, ваш код получит доступ к неинициализированному полю A::_instance::test_map, что может привести к ошибке сегментации. Я предлагаю вам переписать getInstance создать экземпляр при необходимости:

A *A::_instance; 

A& A::get_instance() { 
    cout << "A::get_instance()\n"; 
    if(!_instance) 
    _instance = new A; 
    return *A::_instance; 
} 

В качестве примечания, я предлагаю вам использовать AddressSanitizer автоопределение это и подобные типы ошибок.

+0

Большое спасибо – user6246294