İnsanlar neden C ++ 'da __ (çift alt çizgi) bu kadar çok kullanıyor?


93

Bazı açık kaynak C ++ kodlarına bir göz atıyordum ve kodda, özellikle değişken adlarının başlangıcında, puanların altında çok fazla ikiye katlanmış fark gördüm.

return __CYGWIN__;

Merak ediyorum bunun bir nedeni var mı, yoksa sadece bazı insanlar stil kodluyor mu? Okumayı zorlaştırdığımı düşünürdüm.


2
Okumak neden zor? Çoğunlukla, alıntılar gibi bir sınırlayıcı olarak tasarlanmıştır. Hatırladığım kadarıyla, esas olarak yerleşik sabitler için kullanılıyor.
Matthew Scharley

1
Hayır, sınırlayıcı değil. Alt çizgiler, uygulama için ayrılmış adları, kullanıcıların kaynak kodunun kullanabileceği adlardan ayırt etmek için kullanılır. Kullanıcılar yapabilir #define FOO 1ancak yapmamaları gerekir #define __FOO__ 1ve bu nedenle uygulama __FOO__kendi makroları, değişkenleri, işlevleri vb. İçin adı kullanmakta özgürdür
Jonathan Wakely

Bence Matthew, işlevsel olarak değil, biçimsel / görsel olarak bir sınır olduğunu kastetti. Bu ilginç bir hipotez, ancak daha önce okuduklarım ve Jonathan'ın cevabı göz önüne alındığında yanlış.
JMI MADISON

Yanıtlar:


128

Gönderen C Programlama ++, Kurallar ve Tavsiyeler :

Tanımlayıcılarda iki altçizginin ("__ ') kullanılması, ANSI-C standardına göre derleyicinin dahili kullanımı için ayrılmıştır.

Alt çizgiler ("_ ') genellikle kitaplık işlevlerinin adlarında (" _main "ve" _exit "gibi) kullanılır. Çarpışmaları önlemek için tanımlayıcıya alt çizgi ile başlamayın.


1
Bu kılavuz namespace, tanıtılmadan önce yazılmış gibi görünüyor .
cz

aynı zamanda C ++ standardından değil, londra imparatorluk kolejindendi; iyi bir öneri olabilir.
stucash

1
@cz İsim alanları alakasızdır. Bir sistem başlığı, alt çizgi ile başlayan bir makro adı tanımlayabilir, örn _main.
martinkunev

Tek alt çizgi ile başlayan tanımlayıcılar yalnızca genel ad alanında saklanırken, tek alt çizgiyle başlayan ve ardından büyük harfle başlayan tanımlayıcılar, herhangi bir yerde çift alt çizgi olan herhangi bir tanımlayıcı gibi ayrılır. Bu bilgi cppreference.com'a
WARhead

50

"Uygulamanın bir parçası", yani standart kütüphaneler olduklarını hissetmedikçe, yapmamalılar.

Kurallar oldukça özeldir ve bazılarının önerdiğinden biraz daha ayrıntılıdır.

Çift alt çizgi içeren veya alt çizgi ile başlayan ve ardından büyük harf gelen tüm tanımlayıcılar, tüm kapsamlarda uygulamanın kullanımı için ayrılmıştır, yani makrolar için kullanılabilirler.

Ek olarak, bir alt çizgi ile başlayan (yani, başka bir alt çizgi veya büyük harf gelmeyen) diğer tüm tanımlayıcılar genel kapsamda uygulama için ayrılmıştır. Bu, bu tanımlayıcıları kendi ad alanlarınızda veya sınıf tanımlarında kullanabileceğiniz anlamına gelir.

Bu nedenle Microsoft, C ++ standardının bir parçası olmayan çekirdek çalışma zamanı kitaplık işlevlerinin çoğu için önde gelen alt çizgi ve tümü küçük harfli işlev adlarını kullanır. Bu işlev adlarının, standart C ++ işlevleriyle veya kullanıcı kodu işlevleriyle çakışmaması garanti edilir.


1
C ++ 'da sadece [lex.name] ve global isimler için [global.names] görüyorum. Referans verebilir misiniz? teşekkürler
a.lasram

36

C ++ Standardına göre, bir alt çizgiyle başlayan tanımlayıcılar kitaplıklar için ayrılmıştır. İki alt çizgi ile başlayan tanımlayıcılar, derleyici satıcıları için ayrılmıştır.


18
Bundan daha fazlası: İçinde herhangi bir yerde çift alt çizgi bulunan tanımlayıcılar saklıdır. 17.4.3.1.2
Steve Jessop

C ++ 'da sadece [lex.name] ve global isimler için [global.names] görüyorum. Referans verebilir misiniz? teşekkürler
a.lasram

10

Yukarıdaki yorumlar doğrudur. __Symbol__genellikle yararlı derleyiciniz (veya önişlemci) satıcınız tarafından sağlanan sihirli bir simgedir. Belki de bu yaygın olarak kullanılan çoğu __FILE__ve __LINE__mevcut dosya ve satır sayısını belirtmek için Cı önişlemci tarafından genişletilmiş olan,. Hatanın metinsel konumu da dahil olmak üzere bir tür program onaylama hatasını günlüğe kaydetmek istediğinizde bu kullanışlıdır.


8

Bu, 'normal' kodda yapmanız gerekmeyen bir şeydir. Bu, derleyicilerin ve sistem kitaplıklarının sizinkiyle çakışmayan sembolleri tanımlayabilmesini sağlar.


4

Uygulama için çift alt çizgi ayrılmıştır

En çok oylanan cevap, C ++ 'da Programlama: Kurallar ve Öneriler :

"Tanımlayıcılarda iki alt çizgi (" __ ') kullanımı, ANSI-C standardına göre derleyicinin dahili kullanımı için ayrılmıştır. "

Bununla birlikte, birkaç C ++ ve C standardını okuduktan sonra, yalnızca derleyicinin dahili kullanımıyla sınırlı olan altçizgilerden bahsetmeyi bulamadım . Standartlar daha geneldir ve uygulama için çift alt çizgi ayırır .

C ++

C ++ (mevcut çalışma taslağı, 2019-5-26 erişildi) şunu belirtir lex.name:

  • Çift alt çizgi __ içeren veya alt çizgiyle başlayan ve ardından büyük harfle başlayan her tanımlayıcı, herhangi bir kullanım için uygulamaya ayrılmıştır.
  • Alt çizgiyle başlayan her tanımlayıcı, genel ad alanında bir ad olarak kullanılmak üzere uygulamaya ayrılmıştır.

C

Bu soru C ++ 'ya özgü olsa da, C standartları 99 ve 17'den ilgili bölümleri aktardım:

C99 bölüm 7.1.3

  • Alt çizgi ve büyük harf veya başka bir alt çizgi ile başlayan tüm tanımlayıcılar her zaman herhangi bir kullanım için ayrılmıştır.
  • Alt çizgiyle başlayan tüm tanımlayıcılar, her zaman hem normal hem de etiket adı alanlarında dosya kapsamına sahip tanımlayıcılar olarak kullanılmak üzere ayrılmıştır.

C17 , C99 ile aynı şeyi söylüyor.

Nedir uygulama ?

C / C ++ için, uygulama , kullanıcı kaynak dosyalarından bir yürütülebilir dosya üretmek için gereken kaynak kümesine gevşek bir şekilde başvurur. Bu içerir:

  • önişlemci
  • derleyici
  • bağlayıcı
  • standart kitaplık

Örnek uygulamalar

Wikipedia'da bahsedilen birkaç farklı C ++ uygulaması vardır . (bağlantı bağlantısı yok, ctrl + f "uygulama")

İşte bir özelliği için bazı anahtar kelimeler ayıran Dijital Mars'ın C / C ++ uygulamasına bir örnek.


3

Diğer birçok kişinin yanıtladığı kitaplıklara ek olarak, Bazı kişiler ayrıca önişlemci ile birlikte kullanmak için makroları veya # tanımlı değerleri adlandırır. Bu, çalışmayı kolaylaştıracak ve eski derleyicilerdeki hataların çözülmesine izin vermiş olabilir.

Bahsedilen diğerleri gibi, isim çakışmasını önlemeye yardımcı olur ve kitaplık değişkenleri ile sizinki arasında ayrım yapmaya yardımcı olur.

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.