Как можно вообще ничего не объявлять внутри main() в С++ и все же иметь рабочее приложение после компиляции?

В интервью я столкнулся с таким вопросом, как:

Ваш друг предоставил вам один файл исходного кода, который печатает Числа Фибоначчи на консоли. Обратите внимание, что основной() блок пустой и не имеет никаких утверждений внутри него.

Объясните, как это возможно (подсказка: глобальный экземпляр!)

Я действительно хочу знать об этом, как такая вещь может быть даже возможна!

Ответ 1

Скорее всего, он реализован как (или его вариант):

 void print_fibs() 
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}

В этом коде глобальная переменная ignore должна быть инициализирована перед входом в функцию main(). Теперь, чтобы инициализировать глобальный, нужно выполнить print_fibs(), где вы можете что-то сделать -— в этом случае, вычислить числа фибоначчи и распечатать их! Аналогичная вещь, которую я показал в следующем вопросе (который я давно просил):

Обратите внимание, что такой код небезопасен и его следует избегать в целом. Например, объект std::cout не может быть инициализирован при выполнении print_fibs(), если да, то что бы сделать std::cout в функции? Однако, если в других обстоятельствах он не зависит от такого порядка инициализации, тогда можно безопасно вызвать функции инициализации (что является обычной практикой в ​​C и С++).

Ответ 2

Надеюсь, что это поможет

class cls
{
  public:
    cls()
    {
      // Your code for fibonacci series
    }
} objCls;

int main()
{
}

Итак, как только объявляется глобальная переменная класса, вызывается конструктор, и вы добавляете логику для печати серии Fibonacci.

Ответ 3

Да, это возможно. Вам нужно объявить глобальный экземпляр объекта, который вычисляет числа Фибоначчи в конструкторе объекта.

Ответ 4

Я знаю несколько примеров, которые вы рассказываете. Один из способов получить это - использовать метапрограммирование шаблона. Используя его, вы можете переместить некоторый процесс вычисления в компиляцию.

Здесь вы можете получить пример с номерами Фибоначчи

Если вы используете его в статическом конструкторе классов, и вы можете писать числа без необходимости писать какой-либо код в основной функции.

Надеюсь, это поможет вам.

Ответ 5

Вещи могут произойти при инициализации глобальных/статических переменных. Код запускается при запуске приложения.

Ответ 6

Все конструкторы [*] для объектов области видимости объекта вызываются до достижения main, как и все выражения инициализатора для переменных объекта без объекта.

Изменить: Кроме того, все деструкторы [*] для всех объектов области видимости объекта вызывают в обратном порядке построения после выхода main. Теоретически вы могли бы поместить свою программу фибоначчи в деструктор объекта.

[*] Обратите внимание, что "все" игнорирует поведение динамически загружаемых и выгружаемых библиотек, с которыми ваша программа напрямую не связана. Тем не менее технически они находятся за пределами базового языка С++.