所以我可以成功地将C ++入口点更改为类,这有助于我将图形系统初始化与主程序代码隔离开来。但是当我从新主程序中调用一些库代码时,整个程序崩溃了。例如:
#include <iostream>
using namespace std;
int ENTRY(){
cout << "hello from here" << endl;
system("pause");
}
我用这些链接器选项编译它: -e__Z5ENTRYv -nostartfiles
没有/ cout / line它可以正常工作,否则它会与/ Access Violation / at
有什么东西我不见了吗?
答案 0 :(得分: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派生您的主类并添加该类型的全局对象。
答案 1 :(得分:3)
在C ++中,main
是一个神奇的功能;编译器可以生成
其中的额外代码,例如,初始化静态变量。
或者,根据实施情况,这可以通过以下方式完成
启动代码。在任何一种情况下,设置一些其他全局符号
作为入口点可能意味着静态变量不会
被初始化。不要这样做:改变这样的入口点
实际上只有在任何地方都不使用静态变量时才有效
即便如此,它也不稳定。