SORU
22 EKİM 2009, PERŞEMBE


Neden derleyici bir hata üretmeden değer döndürmeden olmayan geçersiz bir işlevin dönüş yapabilir misin?

Hiç bu varsayılan olarak, bir hata, (gcc en az) üretmek olmadığını yıllar önce fark ettim ki, o zamandan beri hep merak etmişimdir?

Derleyici bayrakları bir uyarı üretmek için sorun olabilir anlıyorum, ama her zaman bir hata olması gerekmez mi? Neden olmayan geçersiz bir işlev geçerli olmak değer döndürme için mantıklı mı?

Yorum olarak istediğin gibi bir örnek:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}

...derler.

CEVAP
22 EKİM 2009, PERŞEMBE


C99 ve C standartları fonksiyonlar bir değer vermek gerekmez. Değer döndüren bir işlev bir değer geri tanımlı (0) ana fonksiyonu var.

Gerekçe ise her kod yolu bir değeri döndürür diye kontrol etmek oldukça zor olduğu, ve geri dönüş değeri gömülü çevirici ya da diğer zor yöntemlerle ayarlanabilir.

n2960 taslak:

§ 6.6.3/2

Bir işlevin sonunda akan kapalıdır hiçbir değer döndürmek için eşdeğer; tanımsız davranış bu sonuçlar bir değer döndüren bir işlev.

§ 3.6.1/5

Eğer kontrol sonunda ulaşırsa ana bir dönüş karşılaşmadan açıklamada, etkisi o yürütülüyor
return 0;

gcc-Wreturn tipi seçeneği ile çağırırsanız bir uyarı verecektir.

-Tipi WreturnUyarmak bir işlevi ne zaman bir geri dönüş tipi ile tanımlanır int varsayılan. Ayrıca herhangi bir konuda uyarmak hayır return deyimi return-değer dönüş tipi olmayan bir fonksiyon (sonuna düşme void fonksiyonu vücut iade kabul edilir bir dönüş değeri) ve bir ifade ile ifadesi void olan fonksiyonu.

Bu uyarı etkindir-Wall.

Sadece bir merak olarak. Bu kod ne yapıyor bak(1):

#include <iostream>

int foo() {
   int a = 5;
   int b = a   1;
}

int main() { std::cout << foo() << std::endl; } // will print 6 (2)

(1) Bu calling convention architecture bağlıdır.
(2) dönüş değeri son ifade değerlendirme sonucunda, eax kasada saklanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amena

    Amena

    15 Kasım 2006
  • dcigs

    dcigs

    9 EYLÜL 2006
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012