Belirli bir fonksiyonun derleme zamanında C-bağlantısıyla (yani extern "C"
ile) bildirilmiş olup olmadığını kontrol etmenin bir yolu var mı?Bir fonksiyonun derleme zamanında C-bağlantısı olup olmadığını kontrol etme [çözülemez]
Bir eklenti sistemi geliştiriyorum. Her bir eklenti, fabrika işlevlerini eklenti yükleme koduna sağlayabilir. Bununla birlikte, bu, ad (ve GetProcAddress
veya dlsym
'un sonraki kullanımı) yoluyla yapılmalıdır. Bu, ad-manganlamanın önlenmesi için işlevlerin C-bağlantıyla bildirilmesini gerektirir. Eğer atıfta bulunulan işlev C++ - bağlantı ile bildirilmişse (bu isimde bir işlev bulunmadığında çalışma zamanında bulmak yerine) bir derleyici hatası atmak güzel olurdu.
Burada ne demek istediğimi basitleştirilmiş örnek:
extern "C" void my_func()
{
}
void my_other_func()
{
}
// Replace this struct with one that actually works
template<typename T>
struct is_c_linkage
{
static const bool value = true;
};
template<typename T>
void assertCLinkage(T *func)
{
static_assert(is_c_linkage<T>::value, "Supplied function does not have C-linkage");
}
int main()
{
assertCLinkage(my_func); // Should compile
assertCLinkage(my_other_func); // Should NOT compile
}
ikinci fonksiyon için bir derleyici hatası atmak istiyorum is_c_linkage
olası bir uygulaması var mı, ama ilk değil? Bunun mümkün olduğundan emin değilim (yine de bilmek istediğim bir derleyici uzantısı olarak mevcut olabilir). Teşekkürler.
Bunun kesinlikle yapılamadığından şüpheliyim - özellikle standart bir şekilde değil. Yine de ilginç bir soru. –
Bundan emin değilim. Ancak, eğer yapılabilirse bile, GCC'nin desteklemeyeceği oldukça olasıdır, çünkü bir extern "C" ve bir extern "C++" fonksiyon tipinin ayrımını bilmiyor. Böylece her iki türü de aynı şekilde ele alır. –
Eğer uygulamaya özel bir bilgi verecekseniz, bir hata atmak yerine bu uygulama için çalışmasını sağlayabilirsiniz –