Я увидел фрагмент кода на CodeGolf, который предназначен как бомба компилятора, где main
объявлен как огромный массив. Я попробовал следующую (без бомбы) версию:
int main[1] = { 0 };
Кажется, он компилируется под Clang и с предупреждением только в GCC:
предупреждение: "main" обычно является функцией [-Wmain]
Результирующий двоичный файл - это, конечно, мусор.
Но почему он вообще компилируется? Это даже разрешено спецификацией C? Раздел, который, по моему мнению, имеет значение, говорит:
5.1.2.2.1 Запуск программы
Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата int и без параметров [...] или с двумя параметрами [...] или каким-либо другим способом реализации.
Включает ли какой-либо другой способ реализации определенный глобальный массив? (Мне кажется, что спецификация все еще относится к функции.)
Если нет, то это расширение компилятора? Или особенность инструментальных цепей, которая служит другим целям, и они решили сделать ее доступной через интерфейс?