使用gcc 4.8.5编译顺序

时间:2017-02-17 08:42:23

标签: gcc

我的gcc版本是4.8.5

  • posix gcc version 4.8.5 20150623(Red Hat 4.8.5-4)(GCC)

我有两个cpp文件:

  • 1.cpp和2.cpp

虽然1.cpp中有1.cpp的静态函数。 在大多数机器中,我们应该这样:

  • g ++ 2.cpp 1.cpp

或者它会导致编译错误或运行时错误。

但是,在我的gcc 4.8.5机器上,我必须使用“g ++ 1.cpp 2.cpp”进行编译才能使其成功运行。

这是gcc4.8.5的属性吗?或者我的软件有问题,或者我用错了?

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

我的机器是安装在mac的virtulbox上的centos7。这是我的代码:

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();
}

在大多数机器和我在网上看到的内容中,我们应该像这样编译:     g ++ main.cpp 1.cpp

但在我的机器上,我必须像这样编译:     g ++ 1.cpp main.cpp

我的机器或我的gcc出了什么问题?

1 个答案:

答案 0 :(得分: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自动检测此类错误和类似错误。