Почему все файлы C, написанные моим лектором, начинаются с #?

391

Почему все файлы C, написанные моим преподавателем, начинаются С#?

Я просматриваю некоторые примечания к курсу, и каждый исходный файл программы C начинается с единственного # в первой строке программы.

Затем появляются пробелы и следуют за другим материалом, за которым следует функция main.

В чем причина #?

(Теперь это из-за термина, и я не могу спросить этого человека.)

Вот пример (есть дополнительная строка в конце закрытия })

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
  • 10
    stackoverflow.com/questions/35207515/...
  • 3
    Я положил первый пример в заметки к курсу. Буквально есть # , затем пустая строка, затем программа.
Показать ещё 10 комментариев
Теги:
c-preprocessor

2 ответа

593
Лучший ответ

Ничего себе, это требование возвращается к 1970-м годам.

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

Из оригинального проекта C великим Деннисом Ричи:

12. Строки управления компилятором

[...] Чтобы вызвать [препроцессор] для вызова, необходимо, чтобы первая строка программы начинается С#. Поскольку нулевые строки игнорируются препроцессором, эта строка не должна содержать других информация.

Этот документ делает для большого чтения (и позволил мне перейти на этот вопрос, как сумасшедший кот).

Я подозреваю, что лектор просто сентиментален - он не требовался, конечно, с ANSI C.

  • 21
    Насколько я понимаю, требование не в том, чтобы самый первый символ был # в строке сам по себе, а в том, что он начинается с # , так почему бы не перейти непосредственно к #include ? Или я не так понимаю?
  • 12
    @Bathsheba " Для того, чтобы вызвать этот препроцессор, необходимо, чтобы самая первая строка программы начиналась с #. Поскольку препроцессор игнорирует нулевые строки, эта строка не должна содержать никакой другой информации. " может уже содержать директиву препроцессора, но это не обязательно ....
Показать ещё 8 комментариев
1

Ничего не делает

В соответствии со стандартом ISO C/C++:

Директива предварительной обработки вида

# new-line

не имеет никакого эффекта

Таким образом, в современных компиляторах этот пустой хеш ничего не делает (new-line ; like- new-line ; не имеет функциональности).


PS: В предварительно стандартизированном C, # new-line играл важную роль, он использовался для вызова препроцессора C (как указано @Bathsheba). Итак, код здесь был либо написан в тот период времени, либо пришел по привычке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню