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


431

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

Затем есть пустые строки, и после этого другие вещи, сопровождаемые mainфункцией.

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

(Сейчас истек срок, и я не могу спросить парня.)

Вот пример:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}


3
Я положил первый пример в заметки к курсу. Буквально есть #, затем пустая строка, затем программа.
Главный Человек

30
Основное назначение пустых #- это запутывание. Если вы хотите сбить всех с толку, вы можете, например, начать все ваши исходные файлы со строки #//#BEGIN#\\#(которая абсолютно ничего не делает).
Лундин

3
@Bathsheba Это, вероятно, один из этих людей cl.cam.ac.uk/people/academic.html
TylerH

7
@Bathsheba Отметки времени на последней из них показывают, что вы дали достаточно подробный ответ только через одну минуту после того, как был задан вопрос, вместе с соответствующей цитатой из эталонного стандарта C99. Ты определенно заговорщик. Возможно, в иллюминатов. Как оба вопроса оказались настолько популярными?
Nat

Ответы:


614

Ничего себе, это требование идет путь назад к 1970 - е годы.

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

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

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

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

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

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


22
Насколько я понимаю, требование состоит не в том, чтобы самый первый символ должен был быть в #строке сам по себе, а в том, что он начинается с символа « а» #, так почему бы не перейти непосредственно к символу #include? Или я не так понимаю?
Федерико Клез Каллока

14
@Bathsheba " Для того, чтобы вызвать этот препроцессор, необходимо, чтобы самая первая строка программы начиналась с #. Поскольку препроцессор игнорирует нулевые строки, эта строка не должна содержать никакой другой информации. " может уже содержать директиву препроцессора, но это не обязательно ....

5
Это не было требованием, когда я начал программировать на C (1980). ANSI C не был стандартизирован до 1989 года.
pojo-guy

29
@ federico-klez-culloca Если он станет включенным, файл может остаться без начального #, потому что в будущем кто-то удалит ненужное включение, не зная о побочных эффектах ведущего #.
Fadeway

4
@Casanova - Нет. Делать это и принимать такой ответ противоречит правилам сайта. Запрашивать и отвечать под разными аккаунтами противоречит духу правил сайта даже без взаимного голосования, если вы понимаете, о чем я. Нет ничего плохого в том, чтобы ответить на свой вопрос и принять этот ответ, хотя и с той же учетной записью - я делал это в прошлом.
Вирсавия

1

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

Начиная с стандарта ISO C / C ++:

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

# new-line

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

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


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


-5

Вы должны знать о процессе компиляции C. Потому что это «должен знать», как исходный код преобразуется в исполняемый двоичный код (файл).

Исходя из процесса компиляции, исходный код C должен пересечь раздел препроцессора. Но как сказать компилятору предварительно обрабатывать код? ... что символ времени # был введен в индикатор Preprocess для компилятора.

Например, #define PI 3.141есть в исходном коде. Затем он будет изменен после сеанса предварительной обработки. Значит, весь PI будет изменен на 3.141.

Это как #include <stdio.h>, стандартные функции ввода / вывода будут добавлены в ваш исходный код.

Если у вас машина с Linux, компилируйте как gcc -save-temps source_code.c. И посмотрите результаты компилятора.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.