четверг, 3 мая 2012 г.

Задача Hello World

Абсолютно just4fun порой люблю задавать C++ программистам (в основном начинающим, хотя я тоже не особо опытный), следующую задачу (я думаю, что это жуткий боян, но многие про неё и не слышали), которую как-то увидел на одном из форумов. А задача предельно проста: Необходимо написать программу, которая печатает фразу "Hello world", но при условии, что функция int main(int argc, char* argv[]) выглядит следующим образом и не может быть изменена (ни сигнатура, ни тело):
int main(int argc, char* argv[])
{
   return 0;
}
Некоторые предлагают использовать например define и переопредить return. Но тогда мы "ломаем" return. Вообщем с макросами можно "играться", но я их предпочитаю использовать в С++ исключительно для защиты от повторного include и возможно для реализации некоторых платформо-зависимых кусков кода. Самый простой для меня например способ - это просто инициализация глоабльной переменной с помощью вызова глобальной функции, в которой как раз и происходит печать:
#include <cstdio>

int foo()
{
  printf("Hello world\n");
  return 10;
}

int n = foo();

int main(int argc, char* argv[])
{
   return 0;
}
Всё просто :) Есть еще вариации с помощью классов (в конструкторе для глобального объекта), потоки ostream и т.д. Вариантов немало.