Обновить

Как вжарить на С++ 23 или захватываем больницу и переписываем рантайм под Windows 95 и точка

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели14K
Всего голосов 22: ↑21 и ↓1+23
Комментарии5

Комментарии 5

Это конечно здорово. Но проблемма не в компиляторе, а во внешних библиотеках. Они бодро вызывают методы и интерфейсы которых нет например в win95. Я хочу сказать что вам нужна база данных где есть все методы, структуры и константы с указанием когда они появились и как их эмулировать если их нет на целевой платформе. Потом можно спокойно генерировать модули, заголовочнве файлы, загрузчики и заглушки для методов. Например эмулировать несколько дисплеев если на платформе их еще не было или были добавлены специально из вредности. И потом можно будет использовать сторонние библиотеки, собрав их с этими переходниками.

Всякого можно придумать. К примеру динамически загружать функции из msvcrt.dll какой она там версии. Посоветовали, взять реализации STL из STL Port и MS STL. Точечно, буду копировать реализацию, очищая от макросов.

Главная причина, это желание писать движок Arcanum на С++ 23 и сохранить совместимость с Windows 95, 98, Me. Добавлю, то что нужно движку. На остальное пока нет, времени и сил.

Самое главное в C23 для эмбеддинга это типизированные enum-ы и битовые поля на их основе. Теперь наверняка можно нормально в отладчике просматривать текст а не цифры регистров.

Стильно, модно, молодежно!

Боюсь это уже несколько старомодно.

Слишком долго изучать то где есть синтаксис, когда проще использовать С-ассемблер
  1. make simple application on C winapi for SDL 1.2 please

  2. Add error and exception catch using C

#include <SDL.h>
#include <windows.h> // Required for SEH and MessageBox
#include <stdio.h>

// Helper to log SDL errors and exit
void CheckSDLError(const char* msg) {
    const char* error = SDL_GetError();
    if (error && *error != '\0') {
        char fullMsg[256];
        snprintf(fullMsg, sizeof(fullMsg), "%s: %s", msg, error);
        MessageBox(NULL, fullMsg, "SDL Error", MB_OK | MB_ICONERROR);
        SDL_Quit();
        exit(1);
    }
}

int main(int argc, char* argv[]) {
    SDL_Surface* screen = NULL;
    int running = 1;

    // Layer 1: Standard SDL Error Handling
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        CheckSDLError("SDL_Init Failed");
    }

    screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    if (!screen) {
        CheckSDLError("Could not set video mode");
    }

    SDL_WM_SetCaption("Robust SDL 1.2 App (2026)", NULL);

    // Layer 2: Win32 Structured Exception Handling (SEH)
    // This catches crashes (Access Violations, etc.) during the main loop
    __try {
        SDL_Event event;
        while (running) {
            while (SDL_PollEvent(&event)) {
                if (event.type == SDL_QUIT) running = 0;
            }

            // Simulate a potential crash scenario for testing
            // int* crash = NULL; *crash = 10; 

            SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 50, 50, 50));
            
            if (SDL_Flip(screen) == -1) {
                CheckSDLError("SDL_Flip Failed");
            }
            
            SDL_Delay(16);
        }
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) {
        // This block runs if the program crashes inside the __try block
        MessageBox(NULL, "A critical system exception occurred (the app crashed).", 
                   "Fatal Exception", MB_OK | MB_ICONSTOP);
    }

    SDL_Quit();
    return 0;
}

Привет ембедерам! Но у вас же нет здесь ассемблера. Только си.

Я понимаю, почему так выглядит си код. Нет деструктора, есть похожее на исключения. Причем данный механизм именно windows, хотя возможно он скрыт за макросами, для переносимости.

Добавил опрос, для разрядки обстановки:)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации