SORU
28 HAZİRAN 2011, Salı


__ya da __stdcall Windows cdecl?

Şu anda bir DLL olarak dağıtılacak olan Windows için bir C kitaplığı geliştiriyorum. Amacım ikili birlikte çalışabilirlik en üst düzeye çıkarmak için; daha doğrusu, DLL işlevleri MSVC ve MinGW birden çok sürümü ile derlenmiş kod kullanılabilir olmalı DLL dosyasını yeniden oluşturmak zorunda kalmadan. Ancak, en iyi, cdecl stdcall olduğu konusunda kafam karıştı.

Bazen ifadeleri gibi duydum "C çağırma kuralı tek kişi almaktadır aynı Derleyiciler olmasını garanti gibi ifadeler ile tezat", "There are some variations in the interpretation of cdecl, particularly in how to return values". Belli bu kütüphane geliştiriciler durdurmak için görünmüyor (libsndfile gibi) görünen herhangi bir sorun olmadan dağıtmak DLL C çağırma kuralı kullanmak.

Diğer taraftan, stdcall çağırma iyi tanımlanmış gibi görünüyor. Söylendi, tüm Windows derleyicileri temelde Kongre Win32 ve COM için kullanılan çünkü bunu takip etmek zorundadır. Bu Win32/COM desteği olmadan Windows derleyici çok yararlı olmayacağını varsayımına dayanır. Kod parçacıkları forumlarda bir sürü stdcall olarak işlevlerini bildirmek ama net bir şekilde açıklayan tek bir mesaj bulmak için görünmüyor olabilirneden.

Orada çok çelişkili bilgiler var, ve ben çalıştırmak her arama beni gerçekten beni ikisi arasında seçim yardımcı olmuyor farklı cevaplar veriyor. Bir (veya iki eşdeğerdir neden) seçmeliyim neden net, ayrıntılı, argumented bir açıklama arıyorum.

Not: bu soru sadece geçerlidir "klasik" fonksiyonları, aynı zamanda sanal üye işlevini çağırır bu yana en istemci kodu arayüzü ile DLL aracılığıyla "arayüzler", saf sanal dersler (aşağıdaki desenleri açıklanan örneğin here there).

CEVAP
9 Temmuz 2011, CUMARTESİ


Sadece gerçek dünyadaki bazı test (MSVC ve MinGW ile DLL ve uygulamaları derlemek, sonra da onları karıştırma. Göründüğü gibi, cdecl çağırma ile daha iyi sonuçlar elde edildi.

stdcall sorun MSVC parçalar DLL ihracat tablo adları, extern "C" kullanırken bile. daha ayrıntılı olarak: Örneğin foo _foo@4 olur. Bu sadece DEF dosyası kullanarak __declspec(dllexport), kullanmadığınız zaman olur; ancak, DEF dosyaları kanımca bakımı bir güçlük var ve onları kullanmak istemiyorum.

MSVC adı bozma iki sorunu ortaya çıkarır:

  • DLL GetProcAddress kullanarak biraz daha karmaşık hale gelir;
  • Varsayılan olarak MinGW bağlama zorlaştırmaktadır süslü isimler için bir undescore (örneğin MinGW _foo@4 yerine foo@4), önüne gelmez. Ayrıca, görme riski tanıtır, "non-çizgi DLL sürümleri ve uygulamaları ile bağdaşmayan vahşi pop" "sürümleri alt çizgi".

cdecl sözleşme denedim: mükemmel, out-of-the-kutu ve adlarını DLL tablo ver undecorated kalmak MSVC ve MinGW eserler arasında birlikte çalışabilirlik. Hatta sanal yöntemleri için çalışıyor.

, cdecl bu nedenlerden dolayı, benim için kazanan belli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DONFANTASTICKYPESS

    DONFANTASTIC

    1 Temmuz 2007
  • incognitotraveler

    incognitotra

    27 Mayıs 2010
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006