Что такое векторы и <> в C? - PullRequest
6 голосов
/ 29 апреля 2019

Я искал исходный код для gcc (из любопытства) и заметил структуру данных, которую я никогда раньше не видел в C.

В строке 80 и 129 (и во многих других местах) в синтаксическом анализаторе они, кажется, используют векторы.

80:  vec<tree> incomplete_record_decls;
129: ridpointers = ggc_cleared_vec_alloc<tree> ((int) RID_MAX);

Я никогда не сталкивался ни с этим типом данных в C, ни с этими: < >.Они родные для C?

Кто-нибудь знает, кто они и как их используют?

Ответы [ 2 ]

9 голосов
/ 29 апреля 2019

Несмотря на имя файла .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 считают, что это не лучший способ действий в этом случае.

6 голосов
/ 29 апреля 2019

GCC перешел с C на C ++, так как GCC 4.8

GCC теперь использует C ++ в качестве языка реализации.Это означает, что для сборки GCC из исходников вам понадобится компилятор C ++, который понимает C ++ 2003. Более подробную информацию об обосновании и конкретных изменениях см. На странице Преобразование C ++ .

GCC 4.8 Release Series - Изменения, новые функции и исправления

Работа фактически началась задолго до этого, с созданием gcc-in-cxx branch ,Разработчики сначала попытались скомпилировать исходный код с помощью компилятора C ++, поэтому никаких изменений имени не было.Я думаю, они не удосужились переименовать файлы позже, когда объединяет две ветви и официально имеет только одну ветку C ++

Вы можете прочитать переход GCC в C ++ длябольше исторической информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...