2010-10-15 11 views
10

Sadece dize sınıfını kullanan programlarımın <string> üstbilgisini eklemeden derlediğini fark ettim. <iostream>'un <ios_base> içerdiği ve buna karşılık <string> içerir.diğer başlıklarla zaten eklenmiş bir başlık eklemem gerekir mi?

Bu kötü uygulama nedir ve açıkça <string> mu içermem gerekiyor? Sadece bir açıklık hali olsa bile mi?

Bunun sadece <string> başlığından daha fazlası için geçerli olduğunu varsaymak güvenli midir? Belki de bu uygulama özeldir ve <string> başlığının standart durumu <ios_base> ve <iostream> aracılığıyla dahil edilir mi? Saygın ve yaygın olarak kullanılan herhangi bir uygulamanın, her zaman <iostream> numaralı aramayı sağlayan <string> içerdiğinden emin olmak.

+2

http://en.wikipedia.org/wiki/Incl ude_guard. Standart Kütüphane onlara sahiptir. – Dragontamer5788

+0

Bu özelliğe uzun zamandır tanıtılmadığım için oldukça kullanışlıdır. Teşekkürler. – aLostMonkey

cevap

10

İhtiyacınız olan standart kitaplık başlıklarını açıkça içermelisiniz.

Hangi standart kitaplık başlıklarının diğer standart kitaplık başlıklarına dahil olduğu belirtilmez, bu nedenle bu tür ayrıntılar derleyiciler arasında farklılık gösterir.

'un bulunduğu bir durumda, başka bir başlık tarafından dahil edilen bir üstbilgiye güvenmek, bir başlıktaki bir sınıfın başka bir sınıftan türetilmesidir. Örneğin, <iostream><ios_base>'u içermelidir, çünkü <iostream>'da tanımlanan sınıflar <ios_base>'da tanımlanan sınıflardan türetilmiştir.

+2

Uygulamanızı farklı bir işletim sistemine yönlendiren veya farklı bir derleyici ile oluşturmak için uygulamanızı güncelleyen kişi, bu konuda James McNellis'in tavsiyelerini izlerseniz size teşekkür edecektir. İnan bana, geçen hafta içinde, uygun başlıkların dahil edilmemesi nedeniyle, pek çok e-posta yazmak zorunda kaldım. Diğer bazı önemli olanlar: memset bellekte değil.h, bu standart olmayan bir Microsoftizm. Başka bir örnek: fabs ve abs stdlib.h, math.h. – George

+3

@George: 'fabs', 'dır. İntegral tip resmi argüman için 'abs'' ''ndeyken, kayan nokta argümanı için 'abs' (C++’da değil, C’de sanırım) '''ndedir. Şerefe & hth., –

+0

@Alf P. Steinbach: Fab'lar hakkında haklısın, oops. abs sadece C++ için aşırı yüklenmiştir.Aynı kodu bir C++ derleyicisi yerine bir C derleyicisi ile derlediğimizden, fabs() ile bir grup abs() çağrısının yerini almam gerekiyordu. Kafeinsiz olduğumda yayınlamak için aldığım bu. :) – George

7

İyi bir uygulama, önceden dahil edilmiş dosyalar tarafından dahil edildiğinden bağımsız olarak, belirli bir kaynak dosyasında kullanacağınız sınıfların başlıklarını her zaman dahil etmektir.

Kodunuzu yeniden kodlarken, daha yüksek düzeydeki dosyaların (örneğin iostream) birisinin gerekliliğini ortadan kaldırırsanız, uygulamanızın neden derlenmediğini belirlemek oldukça acı verebilir.

+3

+1 Hemen hemen sözcük yanıtlama kelimesinden 2 saniye önce gönder düğmesine basarsınız. – Anthony

+0

Makefile bağımlılarınızın doğru olmasını istiyorsanız, başlık dahil olmak üzere bir * ZORUNLU * ve bir * GÖNDEREME *. – jww

2

sen, sadece derleme için biraz daha zaman ekler kereden fazla ('bir kez # Pragma' ya doğru #ifndef ile) uygun bir başlık eklerseniz (sadece açmak ayrıştırmak ve uzak dosya içeriğinin aracılığıyla) Ancak, dosyalarınızı daha kolay derlerse, hiçbir şey çok ciddi değil, koşullar değişmeli (yani onları farklı bir projeye taşıyın, kütüphaneden çıkarın, vb.) Eğer derleme zamanı konusunda gerçekten endişeleniyorsanız ifndef başlığı (bunu tavsiye etmiyoruz bile) dahil etmeden önce

yani

// header.h 
#ifndef _HEADER_H 
#define _HEADER_H 
int blahblahblah(int); 
#endif 


// cppfile.cpp 
#ifndef _HEADER_H 
#include <header.h> 
#endif 
İlgili konular