Комментарии 5
Это конечно здорово. Но проблемма не в компиляторе, а во внешних библиотеках. Они бодро вызывают методы и интерфейсы которых нет например в win95. Я хочу сказать что вам нужна база данных где есть все методы, структуры и константы с указанием когда они появились и как их эмулировать если их нет на целевой платформе. Потом можно спокойно генерировать модули, заголовочнве файлы, загрузчики и заглушки для методов. Например эмулировать несколько дисплеев если на платформе их еще не было или были добавлены специально из вредности. И потом можно будет использовать сторонние библиотеки, собрав их с этими переходниками.
Всякого можно придумать. К примеру динамически загружать функции из msvcrt.dll какой она там версии. Посоветовали, взять реализации STL из STL Port и MS STL. Точечно, буду копировать реализацию, очищая от макросов.
Главная причина, это желание писать движок Arcanum на С++ 23 и сохранить совместимость с Windows 95, 98, Me. Добавлю, то что нужно движку. На остальное пока нет, времени и сил.
Самое главное в C23 для эмбеддинга это типизированные enum-ы и битовые поля на их основе. Теперь наверняка можно нормально в отладчике просматривать текст а не цифры регистров.
Стильно, модно, молодежно!
Боюсь это уже несколько старомодно.
Слишком долго изучать то где есть синтаксис, когда проще использовать С-ассемблер
make simple application on C winapi for SDL 1.2 please
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;
}
Добавил опрос, для разрядки обстановки:)

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