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