Программа компилируется и запускается без файлов заголовков turbo c ++

Я новичок в программировании. Мой учитель скомпилировал программу вообще без какой-либо директивы препроцессора, и она выполнила и отобразила результат. Это была просто программа "Привет, мир". Меня смущает то, что без директив он мог выполнять функцию «printf».


person lord_jzb    schedule 27.07.2017    source источник
comment
Почему нет? Для чего нужен препроцессор? Фактическая фаза компиляции компилирует файл без какого-либо препроцессора.   -  person 0___________    schedule 28.07.2017
comment
printf? Итак, учитель на самом деле использовал printf.   -  person AnT    schedule 28.07.2017


Ответы (1)


В «классическом» ANSI C (C89 / 90) вы можете вызывать невариадные функции без их предварительного объявления, если вы внимательно относитесь к предоставлению аргументов правильного типа. Итак, если все сделать правильно, можно написать формально действующую программу C89 / 90, не включающую никаких стандартных заголовков. Например.

int main()
{
  puts("Hello World");
  return 0;
}

В современном C это было бы невозможно, поскольку, начиная с C99, все функции должны быть объявлены перед вызовом.

Теперь вызов printf без предварительного объявления этого (с прототипом) вызывал неопределенное поведение даже в C89 / 90, поскольку printf является вариативной функцией. Итак, если ваш учитель сделал что-то подобное

int main()
{
  printf("Hello World\n");
  return 0;
}

тогда ему / ей еще многое предстоит узнать о C. Эта программа C89 / 90 недействительна, даже если она скомпилировала, выполнила и отобразила вывод, который вам "понравился".

Однако вы все равно можете предварительно объявить функцию вручную.

​int printf(const char *format, ...);​

int main()
{
  printf("Hello World\n");
  return 0;
}

и в итоге получится действующая программа C89 / 90, которая не использует никаких директив предварительной обработки. Однако делать это таким образом - не лучшая практика программирования.

person AnT    schedule 27.07.2017
comment
Я пробовал ваш код put на TurboC ++, но он показывает ошибку, говорящую, что put должен иметь прототип. - person Alpha Mineron; 29.07.2017
comment
@AlphaMineron Во-первых, вы должны убедиться, что компилируете свой код как C, а не как C ++. Во-вторых, это должен быть старый C - C89 / 90. - person AnT; 29.07.2017