SORU
21 Ocak 2011, Cuma


C - İleri bildirim

: http://www.learncpp.com/cpp-tutorial/19-header-files/

Şu sözü vardır:

add.cpp:

int add(int x, int y)
{
    return x   y;
}

main.cpp:

#include <iostream>

int add(int x, int y); // forward declaration using function prototype

int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is " << add(3, 4) << endl;
    return 0;
}

Derleyici main.cpp derleme ekleyin ne olduğunu bilemez, böylece ileri bir bildiri denememiştik. Daha önce de belirttiğim gibi, başka bir dosya içinde yaşayan kullanmak istediğiniz her fonksiyonu için bildirimleri yazılı ileri sıkıcı gelebilir.

Açıklar mısınız "ileri beyannamesi" daha fazla? Eğer kullanırsak sorun main() işlevi nedir?

Teşekkürler.

CEVAP
21 Ocak 2011, Cuma


Neden ileri-beyan C gereklidir

Derleyici yazım yanlışın olmadı emin olmak istiyor ya da işlevi için yanlış sayıda bağımsız değişken geçirildi. Bu yüzden, ilk ilan gördüğü konusunda ısrar ediyor' (veya herhangi bir diğer türleri, sınıfları veya işlevleri) kullanılmadan önce. 'Ekle

Bu gerçekten sadece düzgün görünümlü nesne dosyası üretebilir, böylece derleyici kodu doğrulama daha iyi bir iş yapmak için izin verir, ve yarım kalmış, temiz sağlar. Eğer ileri şeyler ilan etmek zorunda değilsin eğer doğru değilse, derleyici işlev olarak tüm olası tahminler hakkında bilgi içermesi gerekir bir nesne dosyası üretecektir '' olabilir. Ve bağlayıcı olur ve içerir çok zekice mantık çalışın ve 'Ekle' aslında amaçlanan arayıp, 'Ekle' fonksiyonu olabilir canlı bir farklı nesne dosyası linker katılacak olan kullanan eklemek için üretmek bir dll veya exe. Linker yanlış ekleyin olabilir. Demek istediğin için kullanmak int add(int a, yüzer b) ama yanlışlıkla unuttum yazmaya, ama linker bulunan bir varolan int add(int a, int b) ve düşündüm ki, doğru ve kullanılan yerine. Kodunuzu derlemek istiyorsunuz, ama beklediğiniz gibi bir şeyi asla yapmazdı.

Yani, sadece bazı şeyleri açık tutmak ve tahmin vb önlemek için, derleyici olmadan olan her şeyi bildirmek için ısrar ediyor.

Deklarasyonu ve tanımı arasındaki fark

Bir kenara olarak, önemli bir beyanı ve tanımı arasındaki farkı bilmek. Beyan sadece bir fonksiyon için, bu dönüş türü yani ... neye benzediğini göstermek için yeterli kod, Kongre, yöntem adı, değişkenler ve türleri arama verir. Ama yöntemi için kod gerekli değil. Bir tanımı için, ilanı ve işlev kodu çok da ihtiyacın var.

Ne kadar ileriye dönük bildirimleri önemli ölçüde kat inşa azaltabilir

Geçerli bir işlev bildirimi alabilirsiniz .cpp veya .h zaten işlevini ilanı içeren başlık yapıyor #araçları dosya. Ancak, bu yavaşlatabilir özellikle eğer derleme, #bir .bir başlığı vardır h yerine .programınızın cpp, her şey gibi #içerir .yazdığın h sona ereceğini #bence yazdığın tüm başlıkları vardır #için içerir. Aniden, derleyici var #siz sadece bir veya iki işlevi kullanmak istedi. hatta derlemek için gereken kod sayfaları ve sayfalar dahil Bunu önlemek için, bir ileri-bildirim kullanımı ve işlevinin bildirimi yazın başında kendiniz yapabilirsiniz. Eğer sadece birkaç fonksiyonları kullanıyorsanız, bu gerçekten hızlı karşılaştırıldığında hep derler yapabilir #başlık dahil. Gerçekten büyük projeler için, fark zaman birkaç dakika için aşağı aldım derleme bir saat veya daha fazla olabilir.

Her ikisi de birbirini kullandığı döngüsel başvuruları ayırmak

Ayrıca, ileriye dönük bildirimleri döngüleri kırmak yardımcı olabilir. Bu ikisi de birbirlerini kullanmaya çalışın. Bu durumda (ve de gayet geçerli bir şey) olabilir #include bir başlık dosyası, ancak bu başlık dosyası çalışır #include başlık dosyası olduğun anda yazmakta.... o zaman #diğer Başlığı içeren #içeren bir yazı. Her başlık dosyası yeniden denemeye tavuk ve yumurta bir durumda kaldın #diğer vardır. Bunu çözmek için, ileri-ilan dosyalardan birinde gereken parçalar ve bırakabilirsiniz #dosya vardır.

Örneğin:

Araba Dosyası.h

#include "Wheel.h"  // Include Wheel's definition so it can be used in Car.
#include <vector>

class Car
{
    std::vector<Wheel> wheels;
};

Tekerlek Dosya.h

Hmm... Araba ilanı burada Tekerlekli bir Araba Araba için bir işaretçi olarak gereklidir.h burada derleyici bir hata sonucu olarak eklenemez. Araba Varsa.h dahil oldu, o zaman Tekerlek dahil etmek için çalışacağını söyledi.Araba yer alacak olan h.Tekerlek yer alacak olan h.h ve bunun yerine, derleyici bir hata üretir böylece sonsuza kadar devam eder. Çözüm ileri Araba yerine bildirmek için:

class Car;     // forward declaration

class Wheel
{
    Car* car;
};

Eğer sınıf Tekerlek araba yöntemleri çağırmak için gereken yöntemler, bu yöntemleri Wheel.cpp içinde tanımlanabilir ve Wheel.cpp şimdi Araba eklemek mümkün.bir döngü neden olmadan h.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • KendrickLamarVEVO

    KendrickLama

    9 ŞUBAT 2011
  • snookie77

    snookie77

    2 Mart 2006