0

Существует ли стандартный аналог конструкции gcc:

__attribute__ ((constructor))

Я понимаю, что всегда можно написать:

 static bool ini_once = ( do_somthing(), true );

, но хотелось бы минимизировать работу при портировании кода с gcc на стандарт С++11/С++14 и не изобретать лишних переменных.

0xdb
  • 51,614
Chorkov
  • 6,900
  • 10
  • 16

1 Answers1

0

Этот атрибут в первую очередь служит для того, чтобы привнести динамическую инициализацию (в стиле С++) в языки, в которых динамическая инициализация не поддерживается, то есть в С.

В С++ любая динамическая инициализация - это и есть аналог. Вы как раз сами и привели абстрактный пример. Можно так, а можно поместить эти действия в конструктор глобального объекта.

  • Решение с созданием дополнительной переменной (а тем более класса), мне не нравится из-за засорения пространства имен. __attribute__((constructor)) позволяет выполнить инициализацию анонимно чего мне и хочется.. – Chorkov Oct 10 '18 at 16:48
  • @Chorkov Используйте лямбды – vt-egorov Oct 10 '18 at 16:59
  • @Chorkov namespace{ auto unused = { std::cout << "hello world" << std::endl; return 0;}(); } – vt-egorov Oct 10 '18 at 17:05
  • @vegorov Так глобальное пространство имен все равно засоряется, потому что снаружи безымянного namespace, ЕМНИП, автоматически ставится using namespace …;. – HolyBlackCat Oct 10 '18 at 17:27
  • Можно еще [[maybe_unused]] дописать, чтобы не было предупреждения о неиспользуемой переменной. – HolyBlackCat Oct 10 '18 at 17:28
  • @HolyBlackCat это с с++11 появилось ? или с c++14? Это в стандарте языка или фича компилятора конкретного ? – vt-egorov Oct 10 '18 at 17:44
  • @vegorov, C++17 – ixSci Oct 10 '18 at 17:48
  • @HolyBlackCat просто это неименованое пространство надо держать в cpp файле, а не в заголовочном – vt-egorov Oct 10 '18 at 17:48
  • 1
    @HolyBlackCat ага, вот почему я ещё не знаю эту фичу =) – vt-egorov Oct 10 '18 at 17:48