Решение 1.
Это работает без каких-либо директив препроцессора в cl и gcc, хотя я не проверял, чтобы убедиться, что я не использую никаких расширений:
#include <stdio.h>
static void exit() {
printf("Hello world");
}
/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/
Я думаю, что это правильно, но я не могу вспомнить, разрешено ли маскирование стандартной библиотечной функции.
Решение 2
Как указали несколько других ответов, вы можете использовать директивы препроцессора, например:
#define
main или exit для вызова ifdef
- используйте
#if 0
для предотвращения компиляции существующего кода
- с использованием
#pragma message
или #error
для печати сообщения во время компиляции
- с использованием
#pragma startup
для использования другой функции в качестве основного или для запуска кода запуска перед основным.
Раствор 3
Если ваш компилятор поддерживает какие-либо функции C ++ помимо C, существует много ответов:
- Объявление класса с конструктором и статической переменной этого типа
- Поместите существующую функцию "main" в отдельное пространство имен (или определение класса) и напишите другой глобальный main
Решение 4
Я также искал способ заставить ошибку времени выполнения (переполнение стека, нехватка памяти, нулевое разыменование, tc), которая обычно заставляла бы программу печатать что-либо, но не могла найти способ, который Это подразумевает запуск дополнительного кода, и в этом случае дополнительный код также может быть printf.