Mengapa semua file C yang ditulis oleh dosen saya mulai dengan satu # di baris pertama?

431

Saya akan melalui beberapa catatan kursus C, dan setiap file sumber program C dimulai dengan satu #di baris pertama program.

Lalu ada baris kosong, dan mengikuti hal-hal lain diikuti oleh mainfungsi.

Apa alasannya #?

(Sekarang sudah tidak berlaku lagi dan aku tidak bisa menanyakan hal itu.)

Ini sebuah contoh:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
Pria Utama
sumber
3
Saya menempatkan contoh pertama dalam catatan kursus. Secara harfiah ada #, lalu baris kosong, lalu program.
The Main Man
30
Tujuan utama dari kosong #adalah kebingungan. Jika Anda ingin membingungkan heck out dari semua orang, Anda bisa misalnya mulai semua file sumber Anda dengan baris #//#BEGIN#\\#(yang tidak melakukan apa-apa).
Lundin
3
@Bathsheba Ini mungkin salah satu dari orang-orang ini cl.cam.ac.uk/people/academic.html
TylerH
7
@Bathsheba Stempel waktu pada yang terakhir menunjukkan bahwa Anda memberikan jawaban yang cukup terperinci hanya satu menit setelah pertanyaan diajukan, lengkap dengan kutipan yang relevan dari standar referensi C99. Anda pasti orang konspirasi. Mungkin di Illuminati. Bagaimana kedua pertanyaan itu akhirnya menjadi begitu populer?
Nat

Jawaban:

614

Wow, persyaratan ini sudah ada sejak tahun 1970-an.

Pada hari - hari awal pra-standar C, jika Anda ingin memanggil preprocessor , maka Anda harus menulis #sebagai hal pertama di baris pertama file sumber. Menulis hanya sebuah #di bagian atas file affords fleksibilitas dalam penempatan arahan preprocessor lain.

Dari konsep C asli oleh Dennis Ritchie yang hebat itu sendiri :

12. Jalur kontrol penyusun

[...] Untuk membuat preprosesor dipanggil, baris pertama program harus dimulai dengan #. Karena garis nol diabaikan oleh preprosesor, baris ini tidak perlu mengandung informasi lain.

Dokumen itu membuat bacaan yang bagus (dan memungkinkan saya untuk melompat pada pertanyaan ini seperti kucing gila).

Saya curiga dosen itu hanya sentimental - belum tentu sejak ANSI C.

Batsyeba
sumber
22
Seperti yang saya pahami, persyaratannya bukan bahwa karakter pertama harus berada #pada garis dengan sendirinya, hanya saja itu dimulai dengan #, jadi mengapa tidak pergi langsung untuk #include? Atau saya salah memahaminya?
Federico klez Culloca
14
@Bathsheba " Untuk membuat preprosesor ini dipanggil, perlu bahwa baris pertama dari program dimulai dengan #. Karena garis nol diabaikan oleh preprosesor, baris ini tidak perlu mengandung informasi lain. " <- jadi itu sudah bisa mengandung arahan preprosesor, tetapi tidak perlu ....
5
Itu bukan keharusan ketika saya memulai pemrograman di C (1980). ANSI C tidak distandarisasi sampai 1989.
pojo-guy
29
@ federico-klez-culloca Jika itu menjadi sebuah menyertakan, file mungkin berakhir tanpa # yang memimpin karena di masa depan seseorang menghapus yang tidak dibutuhkan termasuk sementara tidak mengetahui efek samping dari # yang memimpin.
Fadeway
4
@Casanova - Tidak. Melakukan itu dan menerima jawaban seperti itu melanggar aturan situs. Bertanya dan menjawab dalam akun yang berbeda bertentangan dengan semangat aturan situs bahkan tanpa pemungutan suara bersama, jika Anda mengerti maksud saya. Tidak ada salahnya menjawab pertanyaan Anda sendiri dan menerima jawaban itu dengan akun yang sama - Saya pernah melakukannya di masa lalu.
Batsyeba
1

Tidak melakukan apa-apa

Pada standar ISO C / C ++:

Arahan preprocessing dari formulir

# new-line

tidak berpengaruh.

Jadi dalam kompiler hari ini, hash kosong itu tidak melakukan apa-apa (seperti- new-line ;tidak memiliki fungsi).


PS : Dalam pra-standar C , # new-linememiliki peran penting, digunakan untuk memanggil C Pra-Prosesor (seperti yang ditunjukkan oleh @Bathsheba). Jadi, kode di sini ditulis dalam periode waktu itu, atau berasal dari kebiasaan.

Minhas Kamal
sumber
-5

Anda perlu tahu tentang proses Kompilasi C. Karena itu adalah "harus tahu" bagaimana kode Sumber dikonversi menjadi kode biner yang dapat dieksekusi (file).

Dari Proses Kompilasi, kode sumber C harus melewati Bagian pra-prosesor. Tetapi bagaimana cara memberitahu Kompiler untuk melakukan pra-proses kode? ... Bahwa waktu # Simbol diperkenalkan pada indikator Preprocess ke kompiler.

Sebagai Contoh #define PI 3.141ada dalam kode Sumber. Kemudian akan berubah setelah sesi Preprocessing. Berarti, semua PI akan diubah menjadi 3.141.

Seperti ini #include <stdio.h>, Fungsi I / O standar akan ditambahkan ke dalam kode Sumber Anda.

Jika Anda memiliki mesin Linux, kompilasi like gcc -save-temps source_code.c. Dan lihat output kompiler.

GOBI
sumber