Neden main () 'dan NULL döndürüyoruz?


10

Bazen C ve C ++ programlarında NULLdönüş değeri olarak kullanılan kodlayıcılar, main()örneğin böyle bir şey görüyorum :

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

Bu kodu gcc ile derlediğimde şu uyarıyı alıyorum:

uyarı: return, işaretçi olmadan tamsayı yapar [-Wint-conversion]

Bu makuldür çünkü makro NULLgenişler (void*) 0ve ana dönüş değeri türden olur int.

Kısa bir C ++ programı yaptığımda:

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

Ve g ++ ile derleyin, eşdeğer bir uyarı alıyorum:

uyarı: NULL değerinden işaretçi olmayan 'int' türüne dönüştürme [-Wconversion-null]

Ama neden uyarı verdiğinde NULLdönüş değeri olarak kullanıyorlar main()? Sadece kötü kodlama tarzı mı?


  • Kullanmak sebebi nedir NULLyerine 0dönüş değeri olarak main()uyarısına rağmen?
  • Bunun uygun olup olmadığı uygulama olarak tanımlanmış mı ve eğer öyleyse herhangi bir uygulama neden bir işaretçi değeri geri almak isteyesin?

4
Onlara doğrudan sormalısınız.
juanchopanza

5
msgstr "neden main () 'in dönüş değeri olarak NULL kullanıyorlar?" Bu kodun yazarı yapar. Ben işitme ilgi duyarım onların neden haklı olarak girişimini.
WhozCraig

1
@Vlad Moskova'dan evet ama gerçekten 0 olup olmadığını kontrol etmek zorunda kaldım. ^^ - EXIT_FAILURE8 ve bazı programlarda bazen bir başarı olarak kullanıldığından 1'in başarısızlık için iyi olmadığı anlaşılıyor.
Waelmio

2
@RobertSsupportsMonicaCellio gerçekten aldığınız yanıt buysa, bu biraz üzücü. Birincisi, mantıklı değil ( herhangi bir yerden ziyade her yerde olsaydı daha anlamlı olurdu ). İkincisi, bir satış. Kod yazıyorsanız, doğru olup olmadığı konusunda iyi bir pusulaya sahip olsanız iyi olur; sadece onunla gitmiyor, çünkü birileri tarafından böyle görünüyor ... O iğnenin doğru yönü gösterdiği görülüyor (bu yüzden neden soruyorsunuz); o kodu yazan kişi o kadar da değil, o yüzden nedenini bu cevapla besledi.
WhozCraig

2
C dilinde, NULLişaretçiyi 0(bir oyuncu kadrosu olmadan void *) olarak tanımlamak tamamen geçerlidir . Bu durumda, kusur fark edilmez ve bir uyarı oluşturmaz. NULL için hala kullanılmaması gereken şey bu değil.
Ctx

Yanıtlar:


14

hangisi makul

Evet.

Makro çünkü NULLgenişletilmiş olacaktır(void*) 0

Hayır ise C ++ makro NULL olmamalıdır genişletmek (void*) 0[support.types.nullptr]. Bunu sadece C'de yapabilir.

Her iki durumda da, böyle bir kod yazmak yanıltıcıdır, çünkü nasıl uygulandığına bakılmaksızın null pointer sabitineNULL başvurması gerekir . Bir yerine kullanmak mantıklı bir hatadır.int

  • Uyarana rağmen NULLdönüş değeri olarak 0 yerine kullanılmasının nedeni nedir main()?

Cehalet. Bunu yapmak için iyi bir neden yok.

  • Bunun uygun olup olmadığı uygulama olarak tanımlanmış mı ve eğer öyleyse herhangi bir uygulama neden bir işaretçi değeri geri almak isteyesin?

Hayır, asla uygun değildir . Derleyicinin izin verip vermemesi uygulamaya bağlıdır . Uygun bir C ++ derleyicisi uyarı vermeden buna izin verebilir.


1
Her zamanki güm: değil mi implementaiton tanımlı derleyici izin veriyorsa olsun; öyle implemenation özgü . Standartta "uygulama tanımlı", uygulamanın ne yaptığını belgelemesi gerektiği anlamına gelir.
Pete Becker

@PeteBecker Yazarken durakladım ama yine de devam ettim (çünkü “uygulamaya özgü” ve benzer ifadeler doğal değil). Ama haklısın, değiştireceğim.
Konrad Rudolph

Bana öyle geliyor ki, "uygulama tanımlı" nın doğal görünmesinin tek nedeni, insanların bunun yanlış kullanıldığını görmeye alışkın olmasıdır. <g>
Pete Becker

8

Bu kodu gcc ile derlediğimde şu uyarıyı alıyorum:

warning: return makes integer from pointer without a cast

Bunun nedeni, gevşek derleyici seçenekleriyle derlemenizdir. Katı C standart ayarlarını kullanın ve boş işaretçi sabitine genişleyen -std=c11 -pedantic-errorsuygulamalarda beklenen derleyici hatasını alırsınız . Bkz. “Oyuncusuz tamsayıdan / işaretçi olmadan tamsayıdan işaretçi” sorunları .NULL(void*)0

NULLGenişleyen uygulamalarda 0, kod kesinlikle standart uyumlu, ancak çok kötü bir stil, taşınabilir olmayan ve hepsinden kötüsü: tam bir saçmalık.

Ve g ++ ile derleyin, eşdeğer bir uyarı alıyorum:

warning: converting to non-pointer type int from NULL [-Wconversion-null]

C ++ 11 ve sonraki sürümlerde NULLkullanılmamalıdır - bunun yerine kullanın nullptr. Main () işlevinden döndürmek ne olursa olsun yanlıştır. NULLher zaman 0C ++ 'da genişler, bu yüzden kesinlikle işe yarayacak, ancak çok kötü bir stil ve hepsinden kötüsü: tam bir saçmalık.

Sadece kötü kodlama tarzı mı?

Sadece kötü değil, mantıksız kodlama tarzı. Bunu yazan programcı beceriksizdi.


2

Sadece kötü kodlama tarzı mı?

Daha da kötüsü. Programın iyi tamamlandığını belirtmenin doğru yolu

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
Bu saf bilgiçlik. C standardına göre, 0 argümanı exit()(veya main'den 0 dönüş değeri) ile aynı anlama gelir EXIT_SUCCESS.
mosvy

Ve c99 beri sadece atlayabilirsiniz returndan main. Yani, programınızın daha "doğru" bir versiyonu int main(void){};-)
mosvy

1

? Some / many / all? C ++ uygulamaları NULLgenişletilmiş bir makrodur 0.

Bu etki genişlediğinde verir return 0. Bu geçerli bir dönüş değeridir.

Sadece kötü kodlama tarzı mı?

Evet.

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.