Изменение точки входа в программу C ++. STL вылетает

Таким образом, я могу успешно изменить точку входа C ++, чтобы она находилась в классе, что помогает мне изолировать инициализацию моей графической системы от основного программного кода. Но когда я вызываю какой-то библиотечный код из новой главной программы, вся программа вылетает. Например:

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

Я компилирую его с помощью следующих параметров компоновщика: -e__Z5ENTRYv -nostartfiles
Без строки / cout / он работает нормально, иначе он выйдет из строя с / нарушением доступа / при

введите описание изображения здесь

Что-то мне не хватает?


person slaviber    schedule 17.09.2013    source источник
comment
cout никоим образом не является частью C ++ STL, не говоря уже о STL.   -  person chris    schedule 17.09.2013
comment
Что плохого в использовании main?   -  person graham.reeds    schedule 17.09.2013


Ответы (2)


Как вы думаете, что именно делает -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(); }

Теперь просто создайте свой основной класс из приложения и добавьте глобальный объект этого типа.

person Sebastian Redl    schedule 17.09.2013
comment
Он вылетает даже без -nostartfiles /, я реализую main () {}, который ничего не делает /. - person slaviber; 17.09.2013
comment
Но вы также переопределяете точку входа, так в чем смысл? Я думаю, что вы создаете чрезмерно сложное решение для решения проблемы и сталкиваетесь с проблемой. - person Sebastian Redl; 17.09.2013
comment
Проблема в том, что WinMain требуется так много кода для отображения простого окна, и я не хочу, чтобы этот код был развернут в самом первом файле каждого приложения Windows. - person slaviber; 17.09.2013
comment
Добавлен способ скрыть шаблон в повторно используемом файле. - person Sebastian Redl; 17.09.2013

В C ++ main - это волшебная функция; компилятор может сгенерировать в нем дополнительный код, например, для инициализации статических переменных. Или, в зависимости от реализации, это может быть сделано с помощью кода запуска. В любом случае установка какого-либо другого глобального символа в качестве точки входа, вероятно, будет означать, что статические переменные не будут инициализированы. Не делайте этого: изменение точки входа таким образом действительно только в том случае, если вы не используете статические переменные где угодно, и даже тогда это будет шатко.

person James Kanze    schedule 17.09.2013