2

所以我可以成功地将 C++ 入口点更改为在一个类中,这有助于我将图形系统初始化与主程序代码隔离开来。但是当我从新的 main 调用一些库代码时,整个程序崩溃了。例如:

#include <iostream>
using namespace std;
int ENTRY(){
    cout << "hello from here" << endl;
    system("pause");
}

我使用以下链接器选项对其进行编译:-e__Z5ENTRYv -nostartfiles
没有 /cout/ 行它可以正常工作,否则它会因 /Access Violation/ 崩溃

在此处输入图像描述

有什么我想念的吗?

4

2 回答 2

5

你认为具体是做-nostartfiles什么的?

它抑制 CRT 初始化,其中包括调用全局构造函数。如果没有全局构造函数,cout则不会初始化。没有初始化,你的程序就会运行起来。

为什么还要搞这个呢?只链接一个小样板会不会更容易main?它可能看起来像这样:

// app.hpp
class App {
protected:
  App();
  virtual ~App();
private:
  virtual int run(/*args if you want them*/) = 0;
  int startup(/*args if you want them*/);
  friend int app_run(/*args if you want them*/);
};

// app.cpp: just add this to your project
namespace { App* the_app; }
App::App() { the_app = this; }
App::~App() {}

int App::startup() {
  // Add whatever code you want here, e.g. to create a window.
  return run();
}

int app_run() { return the_app->startup(); }

int main() { return app_run(); }
int wmain() { return app_run(); }
int WinMain(HINSTANCE, HINSTANCE, char*, int) { return app_run(); }
int wWinMain(HINSTANCE, HINSTANCE, WCHAR*, int) { return app_run(); }

现在只需从 App 派生主类并添加该类型的全局对象。

于 2013-09-17T15:55:33.420 回答
3

在 C++ 中,main是一个神奇的函数;编译器可以在其中生成额外的代码,例如初始化静态变量。或者,根据实现,这可以由启动代码完成。在任何一种情况下,将一些其他全局符号设置为入口点可能意味着静态变量不会被初始化。不要这样做:像这样更改入口点实际上只有在您在任何地方不使用静态变量时才有效,即使那样,它也是不稳定的。

于 2013-09-17T16:07:34.043 回答