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
__cplusplustanımlanır, bu yüzden kodu ile sarınextern "C"(ve__cplusplusbu blok içinde tanımlanmayacak) düşünüyorum. Bu nedenle, Ch'ye adım attığında__cplusplustanı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 )