C ++ Linki C dışındaki diller?


25

C ++ dili, hem C ++ hem de C'nin tek bir kaynak dosyada karıştırılmasını sağlar. Örneğin,

extern "C" {
    struct bar { /* ... */ }
}

C ++ ya da C dışında başka herhangi bir "bağlantı dilini" destekledi mi? örneğin extern "Pascal"veyaextern "Haskell"


çoğu zaman her iki dil de extern "C"birbirleriyle etkileşime geçmek için eşdeğerlerini yapar
cırcır

C ++, bağlantıların tiplerini (§7.5) eklemelerine izin vererek diğer bağlantılara destek verir, soru şu olmalı: "Uygulamalar var mı veya uygulamalar var mı" ";-)
johannes

2
extern "C"yalnızca bağlantıyı etkiler, blok içindeki metnin sözdizimini ve anlamını etkilemez. Başka bir deyişle, bu extern "C"bloğun içinde hala C ++ ; sembol isimleri sadece karışık değildir. Bkz. Stackoverflow.com/q/1041866/712605
Richard Hansen, 19

Yanıtlar:


17

extern "C" gerekli olan tek olabilir:

Her uygulama, C programlama dilinde yazılmış "C" ve "C ++", "C ++" ile olan bağlantılara bağlantı sağlayacaktır.

Ancak diğerleri bu alıntıya göre var olabilir:

String-literal gerekli dil bağlantısını gösterir. Bu Uluslararası Standart "C" ve "C ++" string değişmezlerinin anlamlarını belirtir. "C" veya "C ++" dışında bir dize değişmezinin kullanımı, uygulama tanımlı anlambilimiyle koşullu olarak desteklenir. [Not: Bu nedenle, uygulama tarafından bilinmeyen bir dizgeyle ilgili bir bağlantı belirtimi bir tanı gerektirir. - son not] [Not: Dize değişmezinin yazılışının o dili tanımlayan belgeden alınması önerilir. Örneğin, Ada (ADA değil) ve Fortran veya FORTRAN, bağbozumu bağlı olarak. - son not]


1
Bu nereden alıntılandı?
Paul,

@paul c ++ 11 standart taslak
aaronman

9

Birçok (çoğu) ortamdaki "extern" C ", sistemdeki herhangi bir dil için varsayılan bağlantı kuralıdır.

İşletim sistemine ve "yabancı" dilin "C dışında" uygulanmasına bağlı olarak, başka bir derlenmiş dilde bir program çağırmanız için tek ihtiyacınız olan şeydir.


C bağlantısı kullanmayan ortamlarda bile (Pascal yani yığında başka bir argüman sırası kullanır ve callee değeri serbest bırakmak zorunda kalır) C uyumlu bir
moddadır

@johannes: Aslında Windows pek çok şey için Pascal kurallarını kullanıyor, ancak C de ve C de " extern "Language"" sözdizimine sahip olmadığı için, platforma özgü C uzantısı ile yapıyorlar, bu yüzden C ++ için hala sadece extern "C"ve özel anahtar kelime, farklı arama kurallarını belirtir.
Jan Hudec

1
Yine de, derleyici satıcısının özel bağlantı türleri eklediği durumlar olabilir. Diğer dillerle birlikte çalışabilirliğin yanı sıra, bu, farklı C ++ isim yönetimiyle birlikte çalışabilirlik açısından da ilginç olabilir. Soru, birinin yapıp yapmadığıdır :)
johannes


-4
  • Yok hayır! C ++ yalnızca C'yi "bağlantı dilleri" olarak destekler.

  • dış "C" {struct bar {/ * ... * /}}

  • Yukarıdaki gibi bir sözdizimi değişken, struct veya function adını değiştirmez. Çünkü C ++, Class, Namespace ve fonksiyon aşırı yüklenmesini uygulamak için değişken, struct veya function adını değiştirebilir.

  • Bunu yapmazsanız, linker belki değişkenin işlevini, işlev yapısını bulamaz.

  • C ++ C ile uyumlu olacak şekilde tasarlanmıştır. Dıştaki "C", C ile uyumlu bir şekilde uygulanmasının yoludur.


10
Lütfen C ++ standardının §7.5’ini kontrol ediniz. extern "C"ve extern "C++"sadece zorunlu olanlardır, ancak uygulamaların başkalarına sağlamalarına izin verilir.
johannes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.