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.