2013-08-08 24 views
6

Mingw 4.7.2 ile, isnan numaralı çağrı nedeniyle derlenmeyen bir kütüphanem var. std::isnan kullanırsam derleyici "her şey yoluna girecek" diyor ve gerçekten de dosyamı derlemeyi başarabiliyorum. Ben here (Edit: ama belki de here :-) işaretli) kontrol edersenizisnan in std :: namespace içinde mi? Daha genel olarak, std :: gerekli olduğunda, isteğe bağlı mı yoksa kaçınılı mı?

Ama std:: gerekli görünmüyor. Eklediğimde dosya taşınabilir mi olacak?

Genel olarak, her vaka için, std::'un ne zaman konulması gerektiğini (taşınabilirlik için), isteğe bağlı mı yoksa kaçınılması mı gerektiğini anlamanın genel bir yolu var mı?

Düzenleme sorunun kökenleri arasında Nitekim

<math.h> (<cmath> zaten dahil edilmiş bu cpp dosyası dahil etmeye çalışır iken, orada birden başlık kalıntılar vardır ve dahil başlıkların bazı <cmath> içerdiğini zaman).

+1

, orada kontrol [buradan] kontrol etmeyin (http://en.cppreference.com/w/cpp/numeric/math/isnan). –

+0

@ChristianRau Temel olarak C++ 98'de bu yoktu ve bir tanesi sadece C'den borç alarak olabilirdi! İlginç! – Antonio

+0

Hayır, her zaman olduğu gibi olmuştur. Bu link sadece size fonksiyon isminin önünde büyük bir 'std ::' olduğunu göstermelidir. "Isnan" özel işlevinin sadece C++ 11 ile desteklendiği ve C++ 98'de hiç bulunmadığı C90/C6 başlığında değil, C-başlığında bile C (C başlığında değil) ++ 11 kullanır). Yani bir şekilde C'den ödünç alabilirsin, ama C++ ile gelen C'den değil, fakat gerçek bir C99'dan (o zaman garip bir karışım olmalı). –

cevap

12

Hangi üstbilgiye dahil ettiğinize bağlıdır. C başlık <math.h>'u (kullanımdan kaldırılmış olarak işaretlenmiş de olsa C++'nin bir parçası) eklerseniz, isnan gibi niteliksiz C işlevlerini kullanabilirsiniz. Eğer diğer taraftan C++ başlığını <cmath> eklerseniz, düzgün std::isnan gibi onları hak (veya using yönergesi çeşit kullanın) zorunda böylece sadece o std ad içine <math.h> tüm fonksiyonlarını getirdiği garantili ve .Maalesef bir uygulama izin verilir, ancak <cmath> dahil (ve dolayısıyla birçok biridir C -incidences ++ ve akla "benim makinede çalışır" ne zaman de genel ad haline bu işlevleri getirmek için gerekmez Neden birçok kişi kod yazmayı başardı?

Yani Özetle: <math.h> içerir ve isnan kullanabilir veya <cmath> dahildir ve std::isnan kullanmak Ya, her şey olmayan taşınabilir. Tabii ki tüm bunlar diğer C başlıklarına ve ilgili C++ sürümüne de uygulanır.

DÜZENLEME: O bu özel fonksiyon isnan sadece C++ 11 beri desteklenen ve (sizin karışıklık parçası olabilir) hiç C++ 98 yılında mevcut değildi olduğu da unutulmamalıdır. onlar' Fakat bu, çünkü C++ 98 ne <cmath> ne de <math.h> (C++ 11 içermektedir sonra tekrar gerçek C89/C90 başlığını oldu ve C99 başlığındaki) Bu işlevi vardı bu durumda hiçbir şey değişmez her zaman senkronize edilir. Peki Sorunuza bu kütüphane belki çalıştı özellikle iyi bir fikir olmadığı (farklı C99 uygulanmasından isnan fonksiyonunu çekerken o C++ uygulama C89/C90 parçaları çakışabilir olarak, C++ 98 kullanmaktı , bunu hiç denemedim bile).

+0

Yani kullanımdan kaldırıldı! C++ 98'de sadece kullanmalı mıdır? Hem C++ 98 hem de C++ 11'de çalışan kodların olması mümkün olabilir mi? – Antonio

+0

@Antonio Bu sorunun C++ 98 ve C++ 11 ile hiçbir ilgisi yok. C++ standardı ne olursa olsun cevabımda her zaman açıklanmış gibiydi. Ve evet, C başlıkları kullanımdan kaldırıldı, ama pratikte bu gerçekten çok fazla bir şey ifade etmiyor ve daha ziyade kullandığınız bir tat meselesi (kendim için, tamamen anti-C snob ve büyük bir spam fanı) std :: 'yerin her yerine, C++ başlıklarını tercih edin). Ama elbette tutarlı olmalısın, yoksa aslında senin yaptığın gibi bu türden kibarlıklara sahip olursun. –

+0

[Bu, yorumunuzdan önce yazılmıştır] Yukarıdaki Christian Rau yorumuna/bağlantısına bakın: isnan, C++ 98'de bile bulunmamalı ... C++ 98 için tek isnan; std :: 'olmadan çağrılması gereken" "kullanılmamıştır. Yani taşınabilir olmak için ... imkansız :) bazı hantal koşullu derleme koymadıkça. – Antonio

2

Bu, isnan C'den kaynaklanmaktadır. Farklı türde include kullanılması, farklı sonuçlara yol açacaktır. Örnek olarak C başlığındaki <math.h> den isnan atın:

Eğer #include <cmath> kullanırsanız

, bu std ad konacaktır.

#include <math.h> kullanırsanız, bu genel ad alanına yerleştirilir.

C++ 11 D.5 Cı standart kütüphane başlıkları

şekilde name.h bir adı, her biri

her C başlık, hareket gibi standart kütüphane ad yerleştirilen her isim karşılık gelen cname başlığı, global ad alanı kapsamına yerleştirilir. Bu adların ilk olarak ad alanı std'nin ad alanı kapsamı (3.3.6) içinde tanımlanıp tanımlanıp tanımlanmadığı ve daha sonra açık kullanım-bildirimlerle (7.3.3) genel ad alanı kapsamına enjekte edilip edilmediği belirtilmez.

[Örnek: Başlık, bildirimleri ve tanımlarını std. Bu isimleri de global ad alanı içerisinde sağlayabilir. Başlık, C Standardında olduğu gibi, global ad alanında da aynı beyan ve tanımları sağlar. Ayrıca bu isimleri std. (Örnek)

5

C ad bir bağı yoktur. Eğer başlığında bildirilmiş #include <math.h> bütün isimleri yazarken küresel isim alanına gider ve isnan yazmak gerekir. ad alanları vardır ++

° C. Yine de, başlıkta ilan #include <math.h> bütün isimleri yazarken küresel isim alanına gider ve başlığında gitmek bildirilen #include <cmath> bütün isimleri yazarken, sadece ek olarak C

yılında

gibi isnan yazmaya gerek std ad alanına girin ve std::isnan yazmanız gerekir.

Ayrıca, C++ uygulamaları da genel ad stdyanı sıra içine isimlerini koyarak #include <math.h> ile diğer tarafa gitmek izin ve #include <cmath> genel ad içine isimlerini koyarak yanı sıra ile şunlardır std'da. Buna güvenme; Bunu yapan kod taşınabilir değildir. Bu, uygulayıcıların işleri kolaylaştırması için bir imtiyazdır; Gerçekten anlamı, #include <cmath>'u kullanırsanız, genel ad alanında isnan olmayacağını ve #include <math.h> kullanırsanız, std içinde isnan olmayacağını kabul edemezsiniz.

+0

Yani her ikisi de * eklerseniz ne olur? (Bu özel örneğe baktığımda, tutarsız davranışa sahip olacağım) – Antonio

+2

@Antonio Muhtemelen onların ittifaklarına bağlı olarak emirleri ve içerdikleri muhafızları içerir. Kısacası, * bunu hiç yapma *. –

+0

@ChristianRau Teşekkürler, sadece yetkili bir cevaba ihtiyacım var :) (Ben kütüphanenin yazarı değilim) – Antonio