Statik anahtar kelimenin kullanımdan kaldırılması… artık yok mu?


89

C ++ 'da, staticbir sembolün görünürlüğünü (değişken veya işlev bildirimi) etkilemek için bir çeviri birimi içinde anahtar kelimeyi kullanmak mümkündür .

N3092'de bu kullanımdan kaldırıldı:

Ek D.2 [depr.static]
Statik anahtar sözcüğün kullanımı, ad alanı kapsamındaki nesneler bildirilirken kullanımdan kaldırılmıştır (bkz. 3.3.6).

N3225'te bu kaldırılmıştır.

Bulabildiğim tek makale biraz gayri resmi.

Bununla birlikte, C ile uyumluluk (ve C programlarını C ++ olarak derleme yeteneği) için kullanımdan kaldırmanın can sıkıcı olduğunun altını çiziyor. Bununla birlikte, bir C programını doğrudan C ++ olarak derlemek zaten sinir bozucu bir deneyim olabilir, bu yüzden dikkate alınması gerekip gerekmediğinden emin değilim.

Neden değiştirildiğini bilen var mı?


3
C'deki ad alanı kapsamında nesneleri mi ilan ediyorsunuz?
Etienne de Martel

heh, thx, onu nereden alacağını buldum. Yorumu silmeye çalıştım ama beni orada yendin.
Edward Strange


1
Bu aynı zamanda C ++ Komitesine Standardın bir sonraki sürümünde bir şeyin doğruluğunu kaldırma fırsatı verir :-)
James McNellis

Yanıtlar:


75

In C ++ Standart Çekirdek Dili Kusur Raporlar ve Kabul Sorunlar, revizyon 94 altında 1012. Undeprecating statik `onlar not:

7.3.1.1 [namespace.unnamed], ad alanı kapsamında değişkenleri bildirmek için statik anahtar sözcüğün kullanımının, adsız ad alanı daha üstün bir alternatif sağladığından kullanımdan kaldırıldığını belirtmesine rağmen, özelliğin öngörülebilir gelecekte herhangi bir noktada kaldırılması olası değildir .

Temel olarak, 'nin kullanımdan kaldırılmasının staticgerçekten mantıklı olmadığını söylemek . C ++ 'dan hiçbir zaman kaldırılmayacak ve yine de kullanışlıdır, çünkü yalnızca dahili bağlantıya sahip bir işlev veya nesne bildirmek istiyorsanız, adsız ad alanlarında ihtiyacınız olan ortak kod koduna ihtiyacınız yoktur.


2
Görünüşe göre kullanımdan kaldırma, insanları bunun yerine isimsiz ad alanları kullanmaya teşvik edecek ki bu iyi bir şey olabilir.
sbi

1
@unaperson: Başka bir sebep yoksa, isimsiz isim alanları değişkenleri, sabitleri, fonksiyonları ve türleri TU'larına dahil etmek için aynı mekanizmayı sağladığından. static class ... , OTOH, çalışmayacak.
sbi

2
@nbt: Statik sembolleri şablon bağımsız değişkenleri olarak kullanamayacağınız ve birçok yeni başlayanlar statik kullanımını daha kolay bulacağı için <functional> ve <algorithm> ve diğerlerini denemeye çalışılmadığı için. Hızlı bir düşünce.
Sebastian Mach

3
"çünkü isimsiz ad alanları için ihtiyacınız olan ortak kodlara ihtiyacınız yok"? Ne "standart kod"? " namespace {" Ve " }" dışında bir şey mi?
towi

2
@ErikAronesty Aynı adlı başka bir dosyada "yerel sınıf" varsa ODR ihlali yaparsınız.
LF

32

Sorunuzu cevaplamaya çalışacağım, eski bir soru olmasına ve çok önemli görünmemesine rağmen ( kendi başına gerçekten çok önemli değil ) ve şimdiden oldukça iyi cevaplar aldı. Yanıtlamak istememin nedeni, dil mevcut bir dile dayandığında standart evrim ve dil tasarımının temel meseleleriyle ilgili olmasıdır: dil özellikleri ne zaman kullanımdan kaldırılmalı, kaldırılmalı veya uyumsuz şekillerde değiştirilmelidir?

C ++ 'da, bir sembolün görünürlüğünü (değişken veya işlev bildirimi) etkilemek için bir çeviri birimi içinde static anahtar sözcüğünü kullanmak mümkündür.

Bağlantı aslında.

N3092'de bu kullanımdan kaldırıldı:

Kullanımdan kaldırma şunu gösterir:

  • Niyet gelecekte bir özelliği kaldırmak için; bu, kullanımdan kaldırılan özelliklerin bir sonraki standart revizyonda kaldırılacağı veya "yakında" kaldırılmaları gerektiği anlamına gelmez. Kullanımdan kaldırılmayan özellikler bir sonraki standart revizyonda kaldırılabilir.
  • Kullanımını engellemeye yönelik resmi bir girişim .

İkinci nokta önemlidir. Programınızın bir sonraki standarda göre bazen sessizce bozulmayacağına dair resmi bir söz olmamasına rağmen, komite "makul" kodu kırmaktan kaçınmaya çalışmalıdır. Kullanımdan kaldırma, programcılara bazı özelliklere güvenmenin mantıksız olduğunu söylemelidir .

Bununla birlikte, C ile uyumluluk (ve C programlarını C ++ olarak derleme yeteneği) için kullanımdan kaldırmanın can sıkıcı olduğunun altını çiziyor. Bununla birlikte, bir C programını doğrudan C ++ olarak derlemek zaten sinir bozucu bir deneyim olabilir, bu yüzden dikkate alınması gerekip gerekmediğinden emin değilim.

Özellikle başlık dosyaları için bir C / C ++ ortak alt kümesini korumak çok önemlidir. Elbette, staticküresel bildirimler, iç bağlantıya sahip sembol bildirimleridir ve bu, bir başlık dosyasında pek kullanışlı değildir.

Ancak sorun hiçbir zaman sadece C ile uyumluluk değildir, mevcut C ++ ile uyumluluktur: staticküresel bildirimleri kullanan tonlarca mevcut geçerli C ++ programı vardır . Bu kod sadece resmi olarak yasal değildir, aynı zamanda kullanılması amaçlandığı şekilde iyi tanımlanmış bir dil özelliğini kullandığı için sağlamdır .

Sırf artık bir şeyi yapmanın "daha iyi bir yolu" olduğu için (bazılarına göre), eski şekilde yazılan programları "kötü" veya "mantıksız" yapmaz. staticAnahtar kelimeyi nesnelerin ve işlevlerin bildirimlerinde genel kapsamda kullanma yeteneği, hem C hem de C ++ topluluklarında iyi anlaşılmıştır ve çoğu zaman doğru şekilde kullanılır.

Benzer şekilde, C tarzı yayınları geçmek gitmiyorum doubleiçin static_cast<double>sırf "C tarzı yayınları kötü" olarak static_cast<double>sıfır bilgi ve sıfır güvenlik ekler.

Bir şeyi yapmanın yeni bir yolu icat edildiğinde, tüm programcıların mevcut iyi tanımlanmış çalışma kodlarını yeniden yazmak için acele edeceği fikri deliliktir. Devralınan tüm çirkinliği ve sorunları ortadan kaldırmak istiyorsanız, C ++ 'yı değiştirmezsiniz, yeni bir programlama dili icat edersiniz. Tek kullanımının yarı kaldırılması static, C ++ 'yı daha az C-çirkin hale getirir.

Kod değişikliklerinin gerekçelendirilmesi gerekir ve "eski kötüdür" asla kod değişiklikleri için bir gerekçe değildir.

Kırıcı dil değişiklikleri çok güçlü bir gerekçeye ihtiyaç duyar. Dili biraz daha basit hale getirmek, asla bir değişiklik için bir gerekçe değildir.

Neden statickötü olduğu verilen nedenler oldukça zayıftır ve hem nesnelerin hem de işlev bildirimlerinin neden birlikte kullanılmadığı bile net değildir - onlara farklı muamele vermek C ++ 'yı daha basit veya daha ortogonal kılmaz.

Yani gerçekten üzücü bir hikaye. Sahip olduğu pratik sonuçlardan dolayı değil: tam olarak sıfır pratik sonucu vardı. Ancak ISO komitesinden açık bir sağduyu eksikliği gösterdiği için.


5
Sizin de belirttiğiniz gibi, onu kullanımdan kaldırmanın amacı, kullanımından vazgeçirmektir. Yine de, kullanımını caydırmanın yanlış olduğunu iddia etmiyorsunuz. Kesinlikle kimsenin, insanları anonim ad alanları üzerinden ad alanı kapsamlı statik bildirimler kullanmaya teşvik etmediğini umuyorum. Özellikle C'yi çapraz derlemeye ihtiyaç duymadıkları sürece
hayır

2
Küresel kapsam staticveya anonim ad alanları kullanan kişiler hakkında o kadar da umursamıyorum , ben de cesaret verici veya cesaret kırıcı değilim. Demek istediğim, insanları anonim ad alanları kullanmaya gerçekten cesaretlendirmek istiyorsanız, onlara iyi bir argüman vermelisiniz. Pratikte, çoğu uygulamada adsız bir ad alanında bildirilen varlıkların rastgele bir adla dışa aktarılan semboller olduğuna ve bu nedenle dışa aktarma tablosunu büyüttüğüne inanıyorum. staticOTOH olarak beyan edilen varlıklar hiçbir şekilde ihraç edilmez. Bu nedenle, pek çok insan bu gözleme dayanarak kullanmayı seçiyor static.
curiousguy

2
" Sizin de belirttiğiniz gibi, onu kullanımdan kaldırmanın amacı, kullanımından vazgeçirmektir. " Kullanımını caydırmanın amacı, bir gün ortadan kaybolabilmesidir. Demek istediğim, ad alanı kapsamının bir staticdaha kaybolmayacağı, bu yüzden onu kullanımdan kaldırmak yanlış. " Yine de, kullanımını caydırmanın yanlış olduğunu iddia etmiyorsunuz. " İsim-alanı statickullanımının "yanlış" olduğunu gösteren ikna edici bir argüman görmedim . Sadece kullanımını caydırmak için onu küçümsemek yanlıştır, çünkü kimse onun ortadan kalkacağına inanmaz ve insanları onu kullanmanın "yanlış" olduğuna ikna etmez.
curiousguy

5
Bütün dil "bir gün kaybolacak". C ++ 'yı kullanımdan kaldıralım.
Orbit'te Hafiflik Yarışları

2
"Benzer şekilde, static_cast <double> sıfır bilgi ve sıfır güvenlik eklediği için, C-stili yayınları ikiye katlayarak static_cast <double> olarak değiştirmeyeceğim çünkü" C-stili yayınlar kötüdür ". Bir ilkelden diğerine C tarzı yayınların çapkın bir şekilde kullanımından şikayet etmeye devam eden birçok yazılım mühendisi ile sonsuz savaşım.
Makogan

14

Kullanımdan kaldırılmış olsun ya da olmasın, bu dil özelliğinin kaldırılması mevcut kodları bozar ve insanları rahatsız eder.

Tüm statik kullanımdan kaldırma olayı, "anonim ad alanları statikten daha iyidir" ve "referanslar daha iyi işaretçilerdir" çizgileri boyunca sadece arzulu düşünmekti. Lol.


1
"Referanslar daha iyi işaretçilerdir"? Hayır, akıllı işaretçiler daha akıllı işaretçilerdir. Heap, err, free store'dan ayrılan bellek için referansları kullanamazsınız.
Dan Breslau

3
Üzgünüm, ironik bir suratla bitirmeyi unuttum.
Maxim Egorushkin

2
@Dan: Bu cevabın söylediği tam olarak bu: Benzer hatalı bir düşünce çizgisi boyunca "arzulu düşünme". Adsız ad alanları, tıpkı küresel kapsam statik olduğu gibi, biraz farklı nedenlerden ötürü ve uygulanabilirlikte bazı örtüşmeler olsa da, önemli bir özelliktir.
Fred Nurk

@Fred, @Maxim: Yanlış anladıysam veya hafızam hatalıysa özür dilerim. Ama ben "referanslar daha iyi işaretçilerdir" i "anonim isim alanları statikten daha iyidir" ile eşdeğer olarak sınıflandırmıyorum. İkincisi sadık kılma girişiminin çok iyi farkındayım, ancak işaretçileri referanslarla değiştirmek için ciddi bir teklifte bulunan kimseyi hatırlamıyorum. Yine, belki de eksik olan kendi farkındalığımdır.
Dan Breslau

1
@DanBreslau: char* foo = new char; char& ref = *foo;Başlangıçta size bir işaretçi verildiği için referansları kullanma yeteneğiniz hakkında hiçbir şey söylemez.
Orbit'te Hafiflik Yarışları
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.