gcc 4.8.5的编译器顺序

gcc 4.8.5的编译器顺序,gcc,Gcc,我的gcc版本是4.8.5 posix gcc版本4.8.5 20150623(红帽4.8.5-4)(gcc) 我有两个cpp文件: 1.cpp和2.cpp 而在1.cpp中有一个由2.cpp调用的静态函数 在大多数机器中,我们应该这样: g++2.cpp 1.cpp 否则将导致编译错误或运行时错误 但是,在使用GCC4.8.5的机器中,我必须使用“g++1.cpp2.cpp”进行编译,以使其成功运行 这是gcc4.8.5的属性吗?或者我的软件有问题,或者我用错了 =========

我的gcc版本是4.8.5

  • posix gcc版本4.8.5 20150623(红帽4.8.5-4)(gcc)
我有两个cpp文件:

  • 1.cpp和2.cpp
而在1.cpp中有一个由2.cpp调用的静态函数 在大多数机器中,我们应该这样:

  • g++2.cpp 1.cpp
否则将导致编译错误或运行时错误

但是,在使用GCC4.8.5的机器中,我必须使用“g++1.cpp2.cpp”进行编译,以使其成功运行

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

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

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


1.h

#包括
使用名称空间std;
甲级{
私人:
A();
静态A_实例;
地图测试图;
公众:
静态A&get_实例();
静态虚空乐趣();
};
1.cpp

#包括
#包括“1.h”
使用名称空间std;
A::_实例;
A::A(){

我认为你面对的是一个经典的C++错误。如果初始化函数<代码>测试()在调用
A::\u instance
的构造函数之前调用main.cpp中的
,您的代码将访问未初始化的
A::\u instance::test\u map
字段,这可能会导致分段错误。我建议您重写
getInstance
以在需要时创建实例:

A *A::_instance;

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

您能否提供示例代码和错误消息来澄清问题?例如,1.cpp中由2调用的
静态函数。cpp
没有意义(静态函数不能在其定义的文件之外调用)。感谢您的意见,我编辑了问题并添加了代码。期待您的解决方案。还请提供您看到的错误的详细信息。除非您依赖未定义的行为(如静态构造函数的顺序),否则文件的顺序根本不重要。在所有计算机中,两种方式都将成功编译。在另一台计算机中,由“g++main.cpp 1.cpp”生成的可执行文件将成功运行,而由“g++1.cpp main.cpp”生成的文件将成功运行将导致段错误;在我的机器中,rumtime的behiver得到了相反的结果。正如你所说的,我认为静态构造函数顺序的未定义行为导致了这种差异。我认为我应该用另一种方式编写singleton的代码。
#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];
}
#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();
}
A *A::_instance;

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