Void C, C ++ ve C # için ne anlama geliyor?


170

" Geçersiz " teriminin nereden geldiğine ve buna neden geçersiz olarak adlandırıldığına dair temel bilgileri edinmek . Sorunun amacı C deneyimi olmayan ve aniden C tabanlı bir kod tabanına bakan birine yardımcı olmaktır.


2
Bu soru 3 dili karıştırıyor ... eski sorunun 3 farklı soruya bölünmesi gerekiyor.
Stargateur

Yanıtlar:


225

Temel olarak "hiçbir şey" veya "tür yok" anlamına gelir

Boşluğun kullanılmasının 3 temel yolu vardır:

  1. İşlev argümanı: int myFunc(void) - işlev hiçbir şey almaz.

  2. İşlev dönüş değeri: void myFunc(int) - işlev hiçbir şey döndürmez

  3. Genel veri işaretçisi: void* data - 'veri', bilinmeyen tipte verilere bir işarettir ve kayıttan çıkartılamaz

Not: voidbir işlev bağımsız değişkeninde C ++ 'da isteğe bağlıdır, bu yüzden int myFunc()tam olarak aynıdır int myFunc(void)ve C #' da tamamen dışarıda bırakılır. Bir dönüş değeri için her zaman gereklidir.


7
argüman listesindeki void C ++ 'da isteğe bağlıdır, bkz. stackoverflow.com/questions/416345/…
Daniel Earwicker

1
"Boyut yok" yerine "tip yok" kullanırdım
Kjetil Joergensen

@Earwicker ve kjetijor, tartıştığım iyi noktalar, ama uykusuz aklım yardıma ihtiyacı vardı;) Teşekkürler.
Gerald

9
Katılmıyorum, ancak ek bir boşluk kullanımı, kullanılmayan değerlere ilişkin uyarıları bastırmak için "geçersiz kılmak için" numarasındadır. Derleyicinin şeyleri nasıl yorumladığına gerçekten uymadığı için biraz gergin, ancak bunu "Hiçbir şey yapmak için bu değeri kullanıyorum" anlamına gelebilir.
Steve Jessop

22
C ++ 'da, bağımsız değişken listesindeki void isteğe bağlıdır. Bununla birlikte, C'de isteğe bağlı DEĞİLDİR: foo () herhangi bir türde herhangi bir sayıda parametre aldığı anlamına gelirken foo (void) sıfır parametre aldığı anlamına gelir.
Adam Rosenfield

33

Her zaman yok demek için aldım . İşte C dilinde bu yokluğun kullanımıyla eşleşen dört durum

  • R f(void)- Fonksiyon parametreleri mevcut değil
  • void f(P)- Dönüş değeri yok
  • void *p- İşaret edilenin türü yok
  • (void) p- Değerin kullanımı yoktur

Diğer C torunları bunu başka şeyler için kullanırlar. DBir başlatıcı olduğu programlama dili durumlar için kullanır devamsızlık

  • T t = void;- başlangıç ​​değeri yok

4
Ne yapar (void)p? Ne demek istediğini anlamadım "değer kullanımı yok".
Yashas

@Yashas İfadeyle ilgili herhangi bir karışıklık olursa (void) var;, stackoverflow.com/q/21045615 adresinde ayrıntılı yanıtlar buldum .
Arnie97

14

Boşluğu kullanmanın iki yolu vardır:

void foo(void);

veya

void *bar(void*);

Birincisi hiçbir argümanın geçilmediğini veya hiçbir argümanın döndürülmediğini gösterir.

İkincisi, derleyiciye, verilerle ilişkili bir türün bulunmadığını söyler; bu da, bilinen bir türe yayınlanana kadar işaret edilen verileri kullanamayacağınız anlamına gelir.

Örneğin void*, parametreleri önceden bilinemeyen bir işlevi çağıran bir arabiriminiz olduğunda çok kullanıldığını göreceksiniz .

Örneğin, Linux Çekirdeğinde çalışmayı ertelerken, çalıştırılacak işleve bir işaretçi ve işleve iletilecek verilere bir işaretçi vererek, daha sonra çalıştırılacak bir işlevi ayarlayacaksınız:

struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data        = somedata;
} deferred_work;

Daha sonra bir çekirdek iş parçacığı ertelenmiş işlerin bir listesi üzerinden geçer ve bu düğüme ulaştığında etkili bir şekilde yürütür:

bar(somedata);

Sonra barda var:

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}

13

"Değersiz" anlamına gelir. Sen kullanmak voidbir işlev bir değer döndürmüyor olduğunu belirtmek için veya parametreleri veya her ikisi hiç olmadığını. İngilizce void kelimesinin tipik kullanımlarıyla hemen hemen tutarlı .


4

Bir işlevde bir dönüş değerinin olmadığını gösterir.

Bazı diller iki tür alt rutine sahiptir: prosedürler ve fonksiyonlar. Prosedürler sadece bir işlem dizisidir, bir fonksiyon ise sonuç döndüren bir işlem dizisidir.

C ve türevlerinde, ikisi arasındaki fark açık değildir. Her şey temelde bir işlevdir. voidAnahtar kelime bir değer döndürülmesine olmaması sebebiyle, bir "gerçek" fonksiyonu olmadığını gösterir.


3

Boşluğu "boş yapı" olarak düşünün. Açıklamama izin ver.

Her işlev, her parametrenin bir türünün bulunduğu bir dizi parametre alır. Aslında, parametreleri bir yapıya paketleyebiliriz, yapı yuvaları parametrelere karşılık gelir. Bu, her işlevin tam olarak bir argüman olmasını sağlar. Benzer şekilde, fonksiyonlar bir türe sahip bir sonuç üretir. Bir boolean olabilir veya şamandıra olabilir veya keyfi olarak başka türden değerler içeren bir yapı olabilir. Birden fazla dönüş değerine sahip bir dilek istiyorsak, bir yapıya paketlenmelerinde ısrar etmek kolaydır. Aslında, her zaman bir fonksiyonun bir yapı döndürdüğü konusunda ısrar edebiliriz. Şimdi her fonksiyon tam olarak bir argüman alıyor ve tam olarak bir değer üretiyor.

Şimdi, "hayır" değeri üreten bir fonksiyona ihtiyacım olduğunda ne olur? 3 yuvalı bir yapı oluşturduğumda ne alacağımı düşünün: 3 değeri var. 2 yuvam olduğunda, iki değer tutar. Bir yuvası, bir değeri olduğunda. Ve sıfır yuva olduğunda, o ... uh, sıfır değerleri, ya da "no" değeri "tutar. Bu nedenle, void döndüren bir fonksiyonun değer içermeyen bir yapı döndürmesi olarak düşünebilirim. dilde bir anahtar kelime yerine, yalnızca boş yapı tarafından temsil edilen türle eşanlamlıdır (belki de önceden tanımlanmış bir türdür :)

Benzer şekilde, değer gerektirmeyen bir işlevi boş bir yapıyı kabul etmek gibi düşünebilirim, örneğin, "boşluk".

Hatta programlama dilimi bu şekilde uygulayabilirim. Bir boşluk değerinin iletilmesi sıfır bayt alır, bu nedenle boşluk değerlerinin iletilmesi, rastgele boyuttaki diğer değerlerin iletilmesi için özel bir durumdur. Bu, derleyicinin "geçersiz" sonucu veya bağımsız değişkeni ele almasını kolaylaştırır. Muhtemelen bir işlev sonucunu atabilecek bir dil özelliği istiyorsunuz; C'de, aşağıdaki ifadede geçersiz olmayan sonuç işlevini foo olarak adlandırırsanız: foo (...); derleyici foo'nun bir sonuç ürettiğini bilir ve basitçe yok sayar. Eğer boşluk bir değer ise, bu mükemmel bir şekilde çalışır ve şimdi "prosedürler" (geçersiz sonuç içeren bir fonksiyon için sadece bir sıfattır) genel fonksiyonların önemsiz özel durumlarıdır.

Void * biraz daha komik. C tasarımcılarının yukarıdaki şekilde boş düşündüklerini düşünmüyorum; sadece bir anahtar kelime oluşturdular. Bu anahtar kelime, birinin rasgele bir türe işaret etmesi gerektiğinde kullanılıyordu, bu nedenle C'deki deyim olarak * geçersizdi. Geçersiz * işaretçi, boş yapının yerleştirildiği bir yerin adresidir.

Diğer T tipleri için void * 'den T *' a yayınlar da bu bakış açısıyla çalışır. İşaretçi dökümleri, çoğu yaygın mimaride çalışan, bileşik T tipinin S alt tipinde bir depolama elemanına fiziksel olarak T'nin başına yerleştirilmiş olması durumunda S * ila T * ve Aynı fiziksel makine adresini kullanmak tersi de işe yarar, çünkü çoğu makine işaretçisi tek bir temsile sahiptir. S türünün void türüyle değiştirilmesi tam olarak aynı etkiyi verir ve böylece void * 'e / void *' den döküm işe yarar.

PARLANSE programlama dili yukarıdaki fikirleri oldukça yakından uygulamaktadır. Biz tasarım goofed ve bir dönüş türü olarak "geçersiz" yakın dikkat etmedi ve böylece prosedür için dil anahtar kelimeler var. Onun çoğunlukla sadece basit bir sözdizimi değişikliği ama bir dilde büyük bir vücut çalışma kodu aldıktan sonra almak için bir şey değil.



2

Boşluk için üç kullanım durumu:

  1. İşlev imzaları. void foo(int bar)bir değer döndürmez. int bar(void)herhangi bir parametre almaz ancak bu genellikle boş argüman listesi ile ifade edilir: int bar(). Burada void anahtar kelimesinin kullanımı, İngilizce'deki anlamına karşılık gelir.

  2. void *Belirtilmemiş verilere işaret eden ve silinemeyen genel üst tip işaretçi . Burada, boşluğun anlamı diğer boşluğun anlamlarından farklıdır: evrensel tip ve tipsiz.

  3. (void) new Foo(this)Dönüş değerinin kasıtlı olarak atıldığı anlamına gelen dökümlerde . Burada anahtar kelime kullanımı İngilizce anlamıyla da eşleşir.

Vaka 1 ve 2 zaten @Gerald tarafından kapsanmıştır, ancak vaka 3 henüz ele alınmamıştır.


2

Kavramı yeni başlayanlara açıklıyorsanız, bir benzetme kullanmak yardımcı olabilir. Tüm bu durumlarda geçersizlik kullanımı, bir kitaptaki "Bu sayfa kasıtlı olarak boş bırakılmıştır" kelimesine sahip bir sayfaya benzer. Derleyiciye, hata olarak işaretlenmesi gereken bir şey ile kasıtlı olarak boş bırakılacak bir tür arasında istediğiniz davranışı ayırt etmek içindir.

Her zaman normalde bir dönüş türü veya işaretçi türü gibi bir tür görmeyi beklediğiniz kodda görünür. Bu nedenle C # 'da, geçersiz bir gerçek CLR türü olan System.Void ile eşleşir çünkü kendi içinde bir türdür.

Bazı programlama dilleri hiçbir zaman boşluk kavramını geliştirmedi, tıpkı bazı insan kültürleri sıfır sayısı kavramını hiç icat etmediği gibi. Hiçlik, sıfır kavramının insan dilini temsil ettiği gibi bir programlama dilinde de aynı ilerlemeyi temsil eder.


Son cümlenizle ilgili bir not - sadece statik olarak yazılmış diller için geçerli olduğunu unutmayın. Dinamik olarak yazılan dillerin hükümsüz kalmasına gerek yoktur çünkü yöntemleri basitçe hiçbir şey döndürmeyebilir - "hükümsüzlük", başka bir şeyin döndürülmemesi nedeniyle ima edilir.
Mark Embling

Son yorumuma düzeltme - Son paragrafı söylemek istedim (cümle değil).
Mark Embling

1

"Değersiz" anlamına gelir. Bir fonksiyonun bir değer döndürmediğini veya herhangi bir parametresinin veya her ikisinin birden olmadığını belirtmek için void kullanırsınız. İngilizce void kelimesinin tipik kullanımlarıyla çok tutarlıdır.

Hiçlik null ile karıştırılmamalıdır. Null adresi yığını üzerinde olan değişken için boş, o adresin öbeğindeki değer boştur.


0

Void yalnızca yöntem imzalarında kullanılır. Dönüş türleri için, yöntem çağrı koduna hiçbir şey döndürmeyecektir. Parametreler için, yönteme hiçbir parametre iletilmez

Örneğin

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

C # 'da parametreler için boşluğu atlayabilir ve yukarıdaki kodu şu şekilde yazabiliriz:

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

Hiçlik null ile karıştırılmamalıdır. Null adresi yığını üzerinde olan değişken için boş, o adresin öbeğindeki değer boştur.


0

Boşluk, tanım gereği bir değer olamaz, eksik bir türdür. Bu, bir değer atanamayacağı anlamına gelir.

Bu yüzden herhangi bir değeri tutamaz.


-1

void işlev veya yöntemden herhangi bir değer döndürmeyeceğiniz anlamına gelir


-1

Void, üç dilde de bir işlevden gelen dönüş türünde hiçbir değere gerek olmadığı anlamına gelir.


-1

Void, Visual Basic'in Sub eşdeğeridir.


Sadece bir dönüş türü olarak. Ben void üç kullanımı daha düşünebilirsiniz: void argümanlar (işlev hiçbir şey alır), void işaretçiler (hiçbir işaretçi türü belirtilmedi) ve void dökümleri (değeri atmak).
c4757p
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.