Ответ 1
foo
будет напечатан первым, поскольку объекты инициализируются в порядке их объявлений. Запустите и посмотрите:
Кстати, __attribute__((constructor))
не является стандартным С++. Это расширение GCC. Поэтому поведение вашей программы зависит от того, как GCC определил ее. Короче говоря, она определяется реализацией, в соответствии с ней сначала печатается foo
.
doc говорит,
Атрибут конструктора заставляет функцию вызываться автоматически до того, как ее запускает main(). Аналогично, атрибут destructor заставляет функцию вызываться автоматически после того, как функция main() завершена или вышла(). Функции с этими атрибутами полезны для инициализации данных, которые будут использоваться неявно во время выполнения программы.
Вы можете указать необязательный целочисленный приоритет для управления порядком, в котором выполняются функции конструктора и деструктора. Конструктор с меньшим номером приоритета запускается перед конструктором с большим номером приоритета; противоположное соотношение имеет место для деструкторов. Итак, если у вас есть конструктор, который выделяет ресурс и деструктор, который освобождает один и тот же ресурс, обе функции обычно имеют одинаковый приоритет. Приоритеты для функций конструктора и деструктора такие же, как те, которые указаны для объектов С++ для пространства имен (см. атрибуты С++).
Я думаю, что текст, выделенный жирным шрифтом, подразумевает, что объекты инициализируются в порядке их объявлений, как я уже говорил, что в значительной степени подтверждается онлайн-демонстрацией.
Думаю, вам также хотелось бы прочитать следующее:
Если вы хотите контролировать/изменять порядок инициализации, вы можете использовать атрибут init_priority
, предоставляя приоритет. Взято с страницы:
Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
Здесь B
инициализируется до A
.