SORU
10 HAZİRAN 2011, Cuma


&Quot;içi" olmadan "durağan" veya "dış" c99'da daha yararlı?

Bu kodu derlerken

inline void f() {}

int main()
{
    f();
}

Komut satırını kullanarak

gcc -std=c99 -o a a.c

Linker hatası (f başvurusu geçersiz). Hata static inline extern inline yerine sadece inline, kullanırsam ya ben -O işlevi aslında inlined) (derleme, Gözden kaybolur.

Bu davranış C99 standardı paragraf 6.7.4 (6) tanımlandığı gibi görünüyor:

Dosya kapsamında tüm bildirimleri eğer çeviri biriminde bir işlev tanımı bir satır içi tanımı extern olmadan inline fonksiyon belirteci vardır. Bir satır içi tanımı işlevi için harici bir tanım sağlamaz, ve başka bir çeviri birimi harici bir tanım yasaklamaz. Satır içi bir tanım çevirmen çeviri aynı birim içinde çalışması için herhangi bir arama gerçekleştirmek için kullanabilir harici bir tanım, bir alternatif sağlar. İşlev çağrısı satır içi tanımı ya da dış tanımını kullanıp belirtilmemiş.

Eğer ben biliyorum bu doğru, bir derleme birimi ile bir fonksiyon tanımlı inline yukarıdaki örnek sadece derler sürekli varsa da bir dış işlev ile aynı adı taşıyan ve hiç bilmiyorum, eğer benim kendi işlevi veya harici işlevi çağrılır.

Bu davranış tamamen kaçık değil mi? C99'da inline static extern olmadan bir işlev tanımlamak için her zaman faydalı mı? Bir şey mi kaçırdım?

Cevapların özeti

Tabii ki bir şey eksikti ve davranışları aptal değil. :)

Nemo explains, fikir koymaktırtanımişlevi

inline void f() {}

üstbilgi dosyası ve tek birbeyannamesi

extern inline void f();

buna uygun .c dosya. extern sadece beyan görünür ikili dışarıdan kod üretimi tetikler. Ve aslında bir inline kullanımı yok .c sadece başlıklarını yararlı -- dosya.

rationale of the C99 committee quoted in Jonathan's answer yerini anlatır, inline derleyici optimizasyon ilgili olarak bir ara yerinde görünür bir işlevin tanımını gerektirir. Bu sadece başlığında tanımını koyarak elde edilebilir, ve tabii ki bir başlıkta bir tanım derleyici tarafından görülen her kod yaymak gerekir. Ama derleyici aslında bir işlev satır içi mecbur olmadığı için, harici bir tanımı bir yerde bulunması gerekir.

CEVAP
10 HAZİRAN 2011, Cuma


Aslında bu mükemmel bir cevap da senin sorunu cevaplar sanırım:

extern inline

Fikri "" başlık dosyası içinde kullanılabilir, ve sonra "" bir .dış satır satır olduğunu c dosya. bir "dış satır içi" dosya nesne hangi derleyici (dışarıdan) görünür oluşturulan kodu içermelidir söyleyin sadece.

[ayrıntılı update]

Bir faydası olduğunu düşünmüyorum "" ("" veya "") dışarıdan bir .statik olmadan içi c dosya. Ama bir üstbilgi dosyasında mantıklı, ve "" bazı beyanname .dış satır içi bir karşılık gerektirir c aslında tek başına bir kod oluşturmak için dosya.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ItZWaffleS420

    ItZWaffleS42

    9 EYLÜL 2011
  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • Peter Sharp

    Peter Sharp

    11 ŞUBAT 2013

İLGİLİ SORU / CEVAPLAR