Okutmanım tarafından yazılan tüm C dosyaları neden ilk satırda tek bir # ile başlıyor?


431

Bazı C ders notlarından geçiyorum ve her C program kaynak dosyası programın #ilk satırında tek bir dosyayla başlıyor .

Sonra boş satırlar ve diğer şeyleri izleyen mainfonksiyon gelir.

Bunun nedeni nedir #?

(Artık süresi doldu ve gerçekten arkadaşa soramam.)

İşte bir örnek:

#

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


3
İlk örneği ders notlarına koydum. Kelimenin tam anlamıyla #, sonra boş bir satır, sonra program var.
Ana Adam

30
#Boşun asıl amacı şaşkınlıktır. Eğer halkı herkesten karıştırmak istiyorsanız, örneğin tüm kaynak dosyalarınızı satırla başlatabilirsiniz #//#BEGIN#\\#(bu kesinlikle hiçbir şey yapmaz).
Lundin

3
@Bathsheba Muhtemelen bu insanlardan biri cl.cam.ac.uk/people/academic.html
TylerH

7
@Bathsheba Bu sonuncunun üzerindeki zaman damgaları, soru sorulduktan sadece bir dakika sonra makul bir ayrıntılı cevap verdiğinizi ve C99 referans standardından ilgili bir alıntıyla tamamlandığınızı gösterir. Kesinlikle bir komplo insanısın. Muhtemelen Illuminati'de. Her iki soru da nasıl bu kadar popüler oldu?
Nat

Yanıtlar:


614

Vay be, bu gereklilik 1970'lere kadar uzanıyor .

İçinde çok erken sen çağırmak istiyorsa önceden standardize C günlerde, önişlemci , o zaman yazmak zorunda #kaynak dosyasının ilk satırında ilk şey olarak. Dosyanın en üstüne yalnızca a yazmak #, diğer önişlemci yönergelerinin yerleştirilmesinde esneklik sağlar.

Gönderen harika Dennis Ritchie kendisi tarafından orijinal bir C taslağı :

12. Derleyici kontrol hatları

[...] Önişlemcinin çağrılmasını sağlamak için, programın ilk satırının # ile başlaması gerekir. Boş satırlar önişlemci tarafından yok sayıldığından, bu satırın başka bilgi içermesi gerekmez.

Bu belge harika okumalar sağlıyor (ve bu soruya deli bir kedi gibi atlamama izin verdi).

Öğretim elemanının sadece duygusal olduğunu sanıyorum - ANSI C'den bu yana kesinlikle gerekli değil.


22
Anladığım kadarıyla, ilk karakterin #tek başına bir çizgi üzerinde olması gerekmiyor , sadece a ile başlıyor #, neden doğrudan a'ya gitmiyorsunuz #include? Yoksa yanlış mı anlıyorum?
Federico klez Culloca

14
@Bathsheba " Bu önişlemcinin çağrılmasını sağlamak için programın ilk satırının # ile başlaması gerekir. Boş satırlar önişlemci tarafından yok sayıldığından, bu satırın başka bilgi içermesi gerekmez. " <- yani olabilir zaten önişlemci direktifi içerir, ama bu .... gerekli değildir

5
C (1980) programlamaya başladığımda bu bir gereklilik değildi. ANSI C 1989'a kadar standartlaştırılmadı.
pojo-guy

29
@ federico-klez-culloca Bir içerme haline gelirse, dosya önde gelen # olmadan bitebilir, çünkü gelecekte birisi lider # 'ın yan etkilerinden habersiz iken gereksiz bir içermeyi siler.
Fadeway

4
@Casanova - Hayır. Bunu yapmak ve böyle bir yanıtı kabul etmek site kurallarına aykırıdır. Farklı hesaplar altında sormak ve cevap vermek, eğer anlamımı alırsanız, karşılıklı oy kullanmadan bile sitenin kurallarının ruhuna aykırıdır. Aynı soruyla kendi sorunuzu cevaplamada ve bu yanıtı kabul etmede hiçbir zararı yoktur - bunu geçmişte yaptım.
Bathsheba

1

Hiç birşey yapmıyor

C / C ++ ISO standardı itibariyle:

Formun bir ön işleme direktifi

# new-line

etkisi yoktur.

Bugünün derleyicilerinde, bu boş karma hiçbir şey yapmaz ( new-line ;hiçbir işlevi yoktur).


PS : In önceden standardize C , # new-line(@Bathsheba tarafından sivri dışarı gibi) C Ön İşlemci çağırmak için kullanılan, önemli bir rolü olmuştur. Yani, buradaki kod ya o zaman dilimi içinde yazılmıştır ya da alışkanlıktan gelmiştir.


-5

C Derleme işlemi hakkında bilmek gerekir. Çünkü bu "bilmeli" Kaynak kodunun Yürütülebilir ikili kod (dosya) dönüştürmek nasıl.

Derleme Sürecinden C kaynak kodunun ön işlemci Bölümünü Geçmesi gerekir. Ama Derleyiciye kodu önceden işlemesini nasıl söyleyebilirim? ... # Sembolünün derleyiciye Önişleme göstergesine getirildiğini.

Örneğin #define PI 3.141, Kaynak kodundadır. Ardından Önişleme oturumundan sonra değişecektir. Yani, tüm PI 3.141 olarak değiştirilecek.

Bu #include <stdio.h>, standart G / Ç İşlevleri Kaynak kodunuza eklenecektir.

Bir Linux makineniz varsa, derleyin gcc -save-temps source_code.c. Derleyici çıktılarına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.