Neden C11'deki çirkin anahtar kelimeler?


15

Şu anda C11 spesifikasyonunun bir taslağını okuyorum . Yeni sunulan anahtar kelimeler: _Bool, _Alignof, _Atomictümü standart ayrılmış anahtar kelimeler yerine özel uzantılar gibi hissediyor struct, union, int.

Standardın temelde standart uzantılardan oluştuğunu anlıyorum ... ama yine de, bu korkunç! Belki yakında __Long_Long_Reallylong_Integer_MSVC_2020_tstandartta sürünen ile sona erecek !

Standart olmayan kodun geriye dönük uyumluluğu, anahtar kelimelerin yeni stilinin tek nedeni midir?


2
Hayır, böyle uzun tipler için endişelenmezdim. _, Az, AZ ve 0-9 arasındaki harf ve sayı birleşimlerinin sayısı, bunun yerine muhtemelen kısa ve hatırlanması zor olacakları anlamına gelir.
Neil

2
Her bir anahtar kelime için daha hoş görünen bir eşanlamlı genellikle ilgili standart kitaplık başlık dosyasında tanımlanır. Örneğin, herhangi bir C11 uygulamasının <stdbool.h>başlık dosyası, gibi bir önişlemci makrosu içermelidir #define bool _Bool. Bu, geriye dönük uyumluluğu koruduğundan düzgün bir çözümdür, ancak yeni başlık dosyasını içeren yeni kodların daha çekici sözdizimini kullanmasına izin verir.
andrew.punnett

Yanıtlar:


20

Mükemmel standart kod ile geriye dönük uyumluluğun daha önemli bir neden olduğunu hayal ediyorum .

Önceki kodda meşru bir tanımlayıcı olarak kullanılmış olabilecek bir anahtar kelime eklerseniz, özellikle bir şekilde karmaşık ayrıştırma kurallarına sahip bir dil olan C'de olası ince hatalardan oluşan bir ton acı yaratırsınız.

Bu tanımlayıcılar bir yerde genel bir arayüz olarak kullanıldıysa, bu tür talihsiz kütüphanelerin tüm kullanıcılarına, hiç C kullanamayan, ancak Ruby veya Python vb.

Bu nedenle yeni anahtar kelimeler daha az hoş kelimelere benziyor ve daha çok insanların başka bir amaçla daha az kullanma şansına sahip olduğu cıvatalı saldırılara benziyor.


Sorunun önemli olmadığı C ++ ile değil C ile ilgili olduğu belirtilmelidir. Cevabınız, yeni bir supoprted türün Bool, eski kodda geniş bir Boolean olarak kabul edilen ancak hiçbir zaman C standardının bir parçası olmayan bir özel türle çakışmaya neden olmamaktan kaçınmak için bir şey olarak adlandırılmasının nedenini kapsar, bu nedenle varsayım güvenli değildir. Yapmak.
Ramhound

1
@Ramhound, IMHO booldaha çok C'nin ruhunda olacak. Ayrıca, bu cevaptan tamamen ikna olmadım, çünkü çirkin kelimeler standart olmayan kod tarafından da kullanılmış olabilir. Ve kelimelerin stilini değiştirmek, standart kelimeleri bir bakışta tanımayı zorlaştırır.
Vorac

6
@Vorac: Sorun, dile boolkoşulsuz olarak eklenirse, kendi (mükemmel yasal) sürümüne sahip tüm projelerin boolderlenmeyi bırakmasıdır. Bu, dil revizyonunun kabulüne ciddi zarar verecektir. Bu, tüm yeni tanımlayıcıların ayrılmış kümeden (bu nedenle ile başlayarak _[capital]) alınmasının sebebidir . Ayrıca için büyük bir talep var olduğu gibi boolkendisi, bu şekilde eklenmiştir typedef _Bool booliçinde <stdbool.h>.
Bart van Ingen Schenau

1
@BartvanIngenSchenau - Bu, insanların kendi Boole değeri olan typedef değerlerini içerdiği bir değere değiştirmelerine stdbool.hveya eski kodlarını desteklemek için kendi typedef'lerini yeni türe güncellemelerine olanak tanır .
Ramhound

1
@Ramhound - değişkenleri olan yeni C11 anahtar sözcükleriyle çakışan insanlar da "Öyleyse kullanmayın?". Yeni dil standartlarıyla çakışmaları önlemek için std = xxx derleme bayrağı vardır.
Scooter

8

Alt çizgi ve büyük harfle (ve çift alt çizgi içeren herhangi bir şey) başlayan isimler, önceki standartlarda derleyici / standart kütüphane uygulaması için ayrılmıştır.

Gönderen Rezerve tanımlayıcıları C89 ve C99 arasında:

Uygulayıcı için ayrıca altçizgi ile başlayan tüm harici tanımlayıcılar ve altçizgi ile başlayan ve ardından büyük harf veya altçizgi ile başlayan diğer tüm tanımlayıcılar da ayrılmıştır.

Bu nedenle teoride, bu yeni anahtar kelimeler daha önce yazılmış herhangi bir kodda kullanılmamalıdır ve bu, herhangi bir basit addan daha iyi bir geriye dönük uyumluluğa yol açar, bu da büyük olasılıkla tek nedendir.


4
Diğerlerinin ifadenizi hızlı bir şekilde doğrulayabilmesi için uygun standartlar bölümüne alıntı yapmalı ve muhtemelen uygun standartlar bölümüne bağlantı vermelisiniz. Bu, cevabınızı geliştirecektir.
SpaceTrucker
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.