Включая структуру и компиляцию в c / c ++ - PullRequest
0 голосов
/ 29 апреля 2019

Я заметил, что при компиляции и компоновке кода, который включает в себя структуру в заголовочном файле, объявление структуры на самом деле необходимо только для компиляции.Допустим, у меня есть файл struct.h, и я могу без проблем заменить его пустым файлом между компиляцией и компоновкой.

Мой вопрос: что именно делает компилятор?Я предполагаю, что должна быть копия объявления struct full в каждом файле .o, использующем структуру, и мне интересно, как она гарантирует, что это всегда одна и та же структура.

Дополнительный вопрос: есть ли способ переопределитьструктура перед связыванием?

1 Ответ

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

Есть несколько аспектов, которые, я думаю, сбивают вас с толку.По сути, структуры - это просто способ сопоставить несколько связанных переменных вместе в блоке памяти.Так что, если у вас есть такая структура:

struct x {
    int a;
    int b;
}

И затем вы используете эту структуру, внутри компилятор действительно создает область памяти для всей структуры.Насколько она велика, зависит от системы, компилятора и т. Д., Но допустим, что int имеет длину 4 байта (32 бита).Часто случается, что то, что делает компилятор, когда вы обращаетесь к myvar.b, это действительно ссылается на 4 байта в область памяти, где хранится myvar.

Но все это делается во время компиляции, когда компилятор преобразует ваш C(или C ++) код в объектный файл.Фактически он не сохраняет саму структуру в объектном файле, а только смещения, необходимые для доступа к частям памяти.Таким образом, для связывания вообще не требуется знание структуры, поэтому, если вы удалите структуру из вашего .h во время связывания, ничего не изменится: потому что компоновщик даже не читает этот файл.

...