2012-03-13 39 views
16

A ve B gibi iki kitaplığa bağlamam gerekir. Dosyalardan bazıları her iki kitaplıkta da ortaktır. Yani, kitaplık A'daki işlevleri bir ad alanı içinde bildiriyorum, abc.C++: Extern C Bir Ad Alanı İçindeki İşlevler

[ in A] 

    namespace abc { 
    extern "C" void func(); 
    } 


[in B] 

    extern "C" void func(); 

projesini inşa ederken, derleyici işlevi değer işlev birden tanımlarını söyleyerek bağlama hataları atar: Yani, A ve B, bir fonksiyon fonk aşağıda benziyor. A adındaki fonksiyonun isminin içinde yer alması ya da extern "C" fonksiyonları ile ilgili bir problem var mı? Varsa, ikisini de nasıl ayırt edebilirim?

cevap

23

Extern "C" yi kullandığınızda, ad manganlığını kapatırsınız, böylece C'nin böyle bir kavramı olmadığı için ad alanı bilgilerini kaybedersiniz. Bu, yinelenen bir tanımlamaya neden olur.

+1

Bununla birlikte, ad önbelleği C önişlemcisi için kapatılamayabilir. Visual C++ 2010'da "__FUNCTION__" makrosunun değeri, "extern" C altında bile tam olarak nitelenmiş tanımlayıcıdır. "Adınız". Bu, '__FUNCTION__',' __PRETTY_FUNCTION__' veya '__func__' gibi önceden tanımlanmış makroları kullanan ad alanlarındaki makroları çağırırken ayaklarınızın üzerine düşecektir. Benim durumumda (bir DLL'den C taslakları ihraç) o yaptı ;-) –

İlgili konular