C / C ++ ön işlemcisinde kendi satırındaki tek bir pound / karma işaretinin (#) amacı nedir?


145

Boost kitaplıklarının kaynak koduna bakıyordum ve genellikle bunlara herhangi bir önişlemci yönergesi eklenmemiş tek pound işaretlerinin olduğunu fark ettim. GCC önişlemci kılavuzunu ve teknik özellik kılavuzunu okudum ve bu konuda hiçbir şey bulamıyorum.

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

4. satırda pound işaretinden sonra hiçbir şey yok. Bunun ne etkisi var? C ön işlemcisi (CPP) spesifikasyonunda tanımlanmış mı?

Boost, platformlar arası bir kitaplık olduğundan, herhangi bir CPP'nin onu doğru bir şekilde ayrıştırması gerektiğini varsayıyorum. Kod boyunca rastgele pound / hash işaretlerine sahip olmanın etkisi / yan etkileri ne olur?


6
@Zaibis Eg. GCC paketindeki önişlemcinin yürütülebilir adı "cpp" (derleyiciler gcc ve g ++ iken)
deviantfan

3
CPP, C-Plus-Plus'ın kısaltmasıdır.
djeidot


7
@djeidot "cpp" belirsizdir. Bu nedenle insanlar C-Plus-Plus'tan bahsederken "c ++" veya "cxx" (x + 45 derece döndü) kullanır.
Mike Ounsworth

12
@djeidot Hayır, CPP, C-Ön İşlemcisidir. C ++ varolmadan çok önce vardı.
Leandros

Yanıtlar:


185

Bir #çizgi üzerinde tek başına A'nın hiçbir etkisi yoktur. Estetik değer için kullanıldığını varsayıyorum.

C standardı diyor ki:

6.10.7 Boş yönerge

Anlambilim

Formun ön işleme yönergesi

# new-line

etkisi yoktur.

C ++ standardı aynı şeyi söylüyor:

16.7 Null yönerge [cpp.null]

Formun ön işleme yönergesi

# new-line

etkisi yoktur.


4
Yine de bu, onu kullanmanın amacını açıklamıyor ve varlığının gerekçesini vermiyor.
StellarVortex

8
"Bunun nasıl bir etkisi var? C ön işlemcisi (CPP) spesifikasyonunda tanımlanmış mı? ... Kod boyunca rastgele pound / hash işaretlerine sahip olmanın etkisi / yan etkileri ne olur?" Ben de öyle cevapladım. Etkisi yok, ancak yazarın onu kullanma nedeni hakkında spekülasyon yapmak istemedim. Ben şimdi yaptım.
Jonathan Wakely

Önişlemci için hiçbir şey ifade etmediği doğru yanıtlar aldınız; Başka bir programın (IDE veya LINT gibi) mantıksal bir birim olarak bir yönerge bloğunu bir arada tutmasına yardımcı olabileceğini tahmin edeceğim. Bazı IDE'ler, programcıların dosyanın mantıksal yapısını izlemelerine yardımcı olmak için metin bloklarını genişletmelerine veya daraltmalarına izin verir.
Spencer

107

Kaynak kodunu güzel gösteriyor, hepsi bu.

Tüm bloğun bir önişlemci bölümü olduğu gerçeğini vurgular.

Gerçekten de, C ve C ++ önişlemcilerinin hem gerekir görmezden #bir çizgi üzerinde.


16
Ayrıca bazı metin düzenleyicilerde (örn. {Veya }vim'de) gezinmeyi kolaylaştırır .
wchargin

@WChargin, bu ona nasıl baktığına bağlı. Eğer ekleyerek, iki önişlemci blokları arasındaki gidin isterseniz #kullanmanızı engelleyecek {veya }. Aslında, }bloğun üzerinden atlamak için iki kez basmak (OP örneğinde), iki bloğun ortasına atlayamamaktan daha kolay olabilir.
Shahbaz

3
@Shahbaz Kesinlikle! Benim genel kuralım, "mantıksal birimleri bir arada tutmaktır", böylece "paragraf" gerçekten "fikir" anlamına gelir. Bu kurala önişlemci bildirimleriyle de uyardım. Tabii ki, büyük ölçüde kişisel bir tarz meselesi.
wchargin

46

Diğer kaynaklara güvenmek yerine her zaman yetkili bir kaynağı kontrol edin. C ISO 9899 :: 2011 olarak standardize edilmiştir, C ++ ayrıca bir ISO standardına sahiptir. Her ikisi de kabul görüyor ve son taslaklar kısa bir aramayla sunuluyor. C standardı 6.10.7'de belirtilmiştir (C ++ hemen hemen aynı metne sahiptir):

Formun ön işleme yönergesi

# new-line

etkisi yoktur.

Çekirdek dilde önceleri olmayan bir ifade null bir ifade olduğu kadar, bu bir boş yönergedir .;

Önişlemci için satırların anlamsal olarak birbirine ait olduğunu vurgulamak sadece biçimlendirme / okunabilirlik içindir. (noktalı virgül OTOH anlamsal olarak ilgilidir).

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.