Несмотря на имя файла .c, этот код недопустим C;это C ++, использующий функцию template этого языка.Если вы проверите процесс сборки gcc, вы обнаружите, что этот файл фактически скомпилирован с помощью компилятора C ++.
https://gcc.gnu.org/codingconventions.html
В каталогах gcc, libcpp и fixincludes могут использоваться C++ 03.Они также могут использовать тип long long, если его поддерживает компилятор C ++.Эти каталоги должны использовать разумно переносимые части C ++ 03, чтобы можно было создавать GCC с компиляторами C ++, отличными от самого GCC.Если тестирование показывает, что разумно последние версии не-GCC C ++ компиляторов не могут компилировать GCC, то код GCC должен быть соответствующим образом скорректирован.(Избегать необычных языковых конструкций очень помогает.) Кроме того, эти каталоги также должны быть совместимы с C ++ 11.
Имейте в виду, что хотя компиляторы обычно по умолчанию выводятЯзык исходного файла из его имени файла, это значение по умолчанию всегда может быть переопределено.Вполне возможно иметь код C ++ в файле .c или код C в файле .bas;вам просто может потребоваться указать компилятору другой способ, какой язык используется.
Я ожидаю, что gcc выбрал это соглашение об именовании файлов, поскольку этот код изначально был написан на C, а затем преобразован в C ++, и они нашли его.слишком много боли, чтобы изменить все имена файлов.Это будет означать большую работу по обновлению всех make-файлов и т. Д. Возможно, было бы не так сложно просто изменить используемый компилятор и объяснить соглашение всем разработчикам.Конечно, в целом лучше программировать имена ваших файлов стандартным способом, но, по-видимому, разработчики gcc считают, что это не лучший способ действий в этом случае.