Чому всі файли C, написані моїм лектором, починаються з одного # у першому рядку?


431

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

Потім з’являються порожні рядки, а за ними - інші 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. Ви, безумовно, змовниця. Можливо, в ілюмінатах. Як обидва питання в кінцевому підсумку стали настільки популярними?
Нат

Відповіді:


614

Ого, ця вимога сягає ще до 1970-х.

У перші дні попередньо стандартизованого C, якщо ви хочете викликати препроцесора , тоді вам довелося написати #перше в першому рядку вихідного файлу. Запис тільки# у верхній частині файлу забезпечує гнучкість в розміщенні інших директив препроцесора.

З оригінальної чернетки C самого Денніса Річі :

12. Лінії управління компілятором

[...] Для того, щоб викликати запрошення [препроцесора], потрібно, щоб перший рядок програми починався з #. Оскільки нульові рядки препроцесором ігноруються, цей рядок не повинен містити іншої інформації.

Цей документ чудово читає (і дозволив мені стрибнути на це питання, як шалений кіт).

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


22
Як я розумію, вимога полягає не в тому, що перший персонаж повинен бути #самим собою на лінії, а саме, що він починається з "а" #, так чому б не піти безпосередньо на "a" #include? Або я це неправильно розумію?
Federico klez Culloca

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 повинен перетинати розділ перед процесором. Але як сказати компілятору попередньо обробити код? ... щоб час # Symbol було введено до індикатора 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.