SORU
24 EYLÜL 2010, Cuma


C birleştiren ve C - nasıl #ifdef __cplusplus iş yapar?

Eski C kodu çok olan bir proje üzerinde çalışıyorum. C yazma , sonunda eski kod, dönüştürme niyetiyle başladık. C ve C etkileşim hakkında biraz kafam karıştı. extern "C" ile C kodu sararak C derleyici C kod isimlerini merdaneyle değil, anlıyorum, ama tamamen bunu uygulamak için nasıl emin değilim.

Yani, başlık dosyası korumaları vardır sonra () her C üstünde

#ifdef __cplusplus
extern "C" {
#endif

ve altında, yazıyoruz

#ifdef __cplusplus
}
#endif

İkisi arasında, içerir, typedefs ve fonksiyon prototipleri olan her şeye sahibiz. Eğer bu anlamamışsam görmek için birkaç soru var:

  1. Eğer hangi dosya C a SS varsa C üstbilgi dosyası içerir B. h, başka bir C başlık dosyası C. h,içerir nasıl oluyor bu iş? Bence derleyici B. h,adımları, __cplusplus, Bu kadar tanımlanacaktır extern "C"kodu ile sona erecek (7 ** olmayacak Bu blok içinde tanımlanan. Yani C. h,içine adım zaman __cplusplus tanımlı değil ve kodu sarılı olmayacak extern "C". Bu doğru mu?

  2. Orada bir şey yanlış. sarma kod parçası ile 10**? İkinci extern "C"ne olacak ?

  3. Etrafında bu kapsayıcı kalmıyor .c dosyaları, sadece .h dosyaları. Eğer bir fonksiyon bir prototip yok eğer doğru değilse ne olacak? Derleyici bir C işlevi olduğunu düşünüyor?

  4. Ayrıca, bazı üçüncü taraf kullanıyoruz C ile yazılmış, ve hangi kod sarıcı değil bu tür şeyler var etrafta . Her zaman bir başlık vardır. bu kütüphane, sürüyorum etrafında extern "C" #vardır. Bunu doğru bir şekilde başa çıkmak için. bu?

  5. Son olarak, bu iyi bir fikir mi ayarlı? Yapmamız gereken başka bir şey var mı? C ve C karıştırma olacağız yakın gelecekte, ve ben tüm araştırıyoruz emin olmak istiyorum üslerimiz.

CEVAP
24 EYLÜL 2010, Cuma


extern "C" gerçekten derleyici kodu okuyan degismedi. Eğer bir kod ise .c dosya, eğer a ise C olarak derlenmiş olacak .cpp dosyası, C olarak derlenmiş olacak bir şey yapılandırmanıza garip yaptığın sürece).

extern "C" ne bağlantı etkiler. C derlenmiş fonksiyonları isimlerini karıştırılmış bu aşırı yüklenmesini mümkün kılıyor. İşlev adı, parametre türleri ve sayısına göre modifiye alır, aynı adı taşıyan iki işlevi farklı sembol isimleri var.

extern "C" bir kod içinde hala C kodudur. Bir dış içinde neler yapabileceğiniz hakkında sınırlamalar vardır "C" blok, ama bağlantı tüm üzereler. C bağlantı ile inşa edilecek bu yeni simgeler tanımlayabilirsiniz. Hiçbir sınıf ya da şablonlar, örneğin anlamına gelir.

extern "C" blokları yuva güzel. Eğer kendinizi umutsuz extern "C" bölgeler içinde sıkışıp bulursanız da extern "C " var, ancak temizlik açısından pek iyi bir fikir değil.

Şimdi, özellikle numaralı soru ile ilgili:

#1 ile ilgili olarak: extern "C" blok cplusplus içinde tanımlanmalıdır__. Bu bloklar birbirine bitişik yuva gerektiğinden, ama sorun olmaz.

#2 ile ilgili: __cplusplus C derleyici ile çalışan herhangi bir derleme birimi tarafından belirlenecektir. Genellikle, anlamına gelir .dosyaları ve tüm dosyaları buna dahil olmak cpp .cpp dosyası. Aynı .(veya .h hh ya .eğer farklı bir derleme birimleri yer alıyor eğer farklı zamanlarda C veya C olarak yorumlanabilir hes ya da ne varsa),. Eğer bu prototip istiyorsanız .h dosyasına bakın sembol isimleri, sonra da onlar olmalı extern "C" zaman olmaya yorumlanır C , ve olmamalıdır. extern "C" ne zaman olmaya yorumlanır C -- dolayısıyla #ifdef __cplusplus kontrol.

Sorunuza cevap #3: prototip eğer olursa .C bağlantı olacak olmadan fonksiyonları cpp dosyaları ve extern "C" bir blok içinde değil. Bu iyi, çünkü eğer herhangi bir prototip, sadece adı verilen diğer işlevler aynı dosya, ve sonra yok genel bakımı ne bağlantı gibi görünüyor, çünkü değilsin planlama olan bu fonksiyonu denilen bir şey dışında aynı derleme birimi zaten.

Tam olarak var #4, için. Eğer siz de dahil olmak üzere bir başlık için bir kod var C bağlantı (gibi bir kod olduğunu derlenmiş bir C compiler) gerekir extern "C" Başlığı -- bu şekilde edebilecektir bağlantısı ile kütüphane. (Aksi takdirde, linker void h(int, char) aradığınız zaman _Z1hic gibi isimlerle fonksiyonları arıyor olurdu

5: karıştırma Bu tür extern "C" kullanmak için ortak bir nedeni var ve bunu bu şekilde yapmak sadece emin ne yaptığını anlamasını sağla. ile yanlış bir şey görmüyorum

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GWTLecturer

    GWTLecturer

    18 EKİM 2012
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • SuppressedStorm

    SuppressedSt

    11 AĞUSTOS 2013