C kütüphanesi errnotarihsel nedenlerden dolayı 0 olarak ayarlanmamıştır 1 . POSIX, artık kitaplıklarının başarı durumunda değeri değiştirmeyeceğini iddia etmiyor ve yeni Linux kılavuz sayfasıerrno.h bunu yansıtıyor:
<errno.h>Başlık dosyası tamsayı değişkeni tanımlayan errnosistem çağrıları ve neyin yanlış gittiğini belirtmek için bir hata durumunda bazı kütüphane fonksiyonları tarafından belirlenir. Değeri yalnızca çağrının dönüş değeri bir hata gösterdiğinde (yani, -1çoğu sistem çağrısından -1veya NULLçoğu kütüphane fonksiyonundan) önemlidir ; başarılı olan bir fonksiyonun değişmesine izin verilir errno.
ANSI C Gerekçe komitesi benimsenmesinin ve kullanmanın mevcut uygulamaları standart hale daha pratik olduğunu hissettim belirtiyor errno.
Ayarı üzerinde odaklanan hata raporlama makineleri errnogenellikle en iyi toleransla değerlendirilir. Kütüphane işlevleri arasında `` patolojik bir bağlantı '' gerektirir ve paylaşılabilir kütüphanelerin yapımına müdahale eden statik yazılabilir bellek hücresini kullanır. Bununla birlikte, Komite daha iddialı bir şey icat etmek yerine, bu eksik, ancak mevcut olan makineleri standartlaştırmayı tercih etmiştir.
Hemen hemen her zaman errnoayarlanmış olup olmadığını kontrol dışında hata kontrol etmek için bir yolu vardır . Olmadığını kontrol etme errnovar kümesi her zaman güvenilir değildir bazı aramalar hata nedeni almak için ayrı bir API çağrısı gerektirir beri. Örneğin ferror(), fread()veya öğesinden kısa bir sonuç alırsanız bir hatayı kontrol etmek için kullanılır fwrite().
İlginçtir ki, kullanmanın senin örneğin strtod()ayarlarken durumlarda biridir errnoçağrı önce 0'a gerekli bir hata oluştu eğer doğru algılamak için. Tüm strto*()dize-sayı işlevleri bu gereksinime sahiptir, çünkü bir hata karşısında bile geçerli bir dönüş değeri döndürülür.
errno = 0;
char *endptr;
double x = strtod(str1, &endptr);
if (endptr == str1) {
/*...parse error */
} else if (errno == ERANGE) {
if (x == 0) {
/*...underflow */
} else if (x == HUGE_VAL) {
/*...positive overflow */
} else if (x == -HUGE_VAL) {
/*...negative overflow */
} else {
/*...unknown range error? */
}
}
Yukarıdaki kod, strtod()Linux'ta belgelendiği şekliyle davranışı temel alır . C standardı, yalnızca düşük akışın en küçük pozitif değerden daha büyük bir değer döndüremeyeceğini doubleve uygulama errnoolarak ayarlanıp ayarlanmayacağını ERANGEuygulama 2 olarak tanımlamaktadır .
Aslında bir kütüphane çağrısından önce daima 0 olarak ayarlanmasını ve çağrıdan sonra değerinin kontrol edilmesini öneren kapsamlı bir sertifika danışma yazımı vardır . Bunun nedeni , çağrının kendisi başarılı olsa bile bazı kütüphane çağrılarının ayarlanmasıdır 3 .errnoerrno
errnoProgram başlangıcında 0 değeri , ancak hiçbir kütüphane işlevi tarafından asla 0 olarak ayarlanmaz. Kullanımı , C Standardındaki işlevin açıklamasında belgelenmediği errnosürece, bir hata olup olmadığına bakılmaksızın kütüphane işlev çağrısı tarafından sıfırdan farklı olarak ayarlanabilir errno. Bir programın içeriğini errnoancak bir hata bildirildikten sonra incelemesi anlamlıdır . Daha doğrusu, errnosadece errnohataya ayarlanan bir kütüphane fonksiyonu bir hata kodu döndürdükten sonra anlamlıdır .
1. Daha önce, önceki bir çağrıdan gelen bir hatayı maskelemekten kaçınmak olduğunu iddia ettim. Bu iddiayı destekleyecek hiçbir kanıt bulamıyorum. Ayrıca sahte bir printf()örnek vardı .
2. @chux'a bunu işaret ettiği için teşekkürler. Referans C.11 §7.22.1.3 ¶10'dur.
3. @KeithThompson tarafından bir yorumda belirtildi.
errno, onu her zaman sıfıra ayarlayabilirsiniz.