Eski C kodu çok olan bir proje üzerinde çalışıyorum . Sonunda eski kodu da dönüştürmek amacıyla C ++ ile yazmaya başladık. C ve C ++ ' nın nasıl etkileştiği hakkında biraz kafam karıştı . Ben sararak anlıyoruz C ile kodu extern "C"
bozmak olmaz derleyici C ++ C kodun isimleri, ama tamamen emin bu nasıl uygulanacağı değilim.
Yani, her bir C başlık dosyasının üstünde (dahil etme korumalarından sonra),
#ifdef __cplusplus
extern "C" {
#endif
ve altta, yazıyoruz
#ifdef __cplusplus
}
#endif
İkisi arasında, tüm içerme, yazım tanımları ve işlev prototiplerimiz var. Bunu doğru anlayıp anlamadığımı görmek için birkaç sorum var:
C başlık dosyası Bh içeren başka bir C başlık dosyası Ch içeren bir C ++ dosyası A.hh varsa , bu nasıl çalışır? Derleyici Bh adımlara
__cplusplus
tanımlanır, bu yüzden kodu ile sarınextern "C"
(ve__cplusplus
bu blok içinde tanımlanmayacak) düşünüyorum. Bu nedenle, Ch'ye adım attığında__cplusplus
tanımlanmayacak ve kod sarılmayacaktırextern "C"
. Bu doğru mu?Bir kod parçasını kaydırmakla ilgili yanlış bir şey var mı
extern "C" { extern "C" { .. } }
? İkincisiextern "C"
ne yapacak?Bu sarmalayıcıyı .c dosyalarının çevresine koymayız, sadece .h dosyalarının içine koyarız. Peki, bir fonksiyonun prototipi yoksa ne olur? Derleyici bunun bir C ++ işlevi olduğunu düşünüyor mu?
Ayrıca C ile yazılmış ve çevresinde bu tür bir sarmalayıcı bulunmayan bazı üçüncü taraf kodları kullanıyoruz . Bu kütüphaneden bir başlık eklediğimde
extern "C"
, #include'un çevresine koyuyorum . Bununla başa çıkmanın doğru yolu bu mu?Son olarak, bu kurmak iyi bir fikir mi? Yapmamız gereken başka bir şey var mı? Öngörülebilir gelecek için C ve C ++ 'ı karıştıracağız ve tüm üslerimizi kapsadığımızdan emin olmak istiyorum.
To ensure that the names declared in that portion of code have C linkage, and thus C++ name mangling is not performed.
( Bağlantıdan aldım )