SORU
10 Temmuz 2012, Salı


Nasıl bazı platformları ve sabit bir char** götüren bir C işlevi başkalarına** char çağrı portably miyim?

(OS X) Linux makinelerde, iconv() fonksiyon prototipi vardır:

size_t iconv (iconv_t, char **inbuf...

FreeBSD üzerinde iken bu gibi görünüyor:

size_t iconv (iconv_t, const char **inbuf...

C kodunu her iki platformu üzerine inşa etmek istiyorum. C derleyicileri ile, const char** parametre char** bir (veya tersi) geçiş genellikle sadece bir uyarı verir; ancak C ölümcül bir hata. Yani eğer geçersem bir char**, yaramaz bir derleme üzerinde BSD, ve eğer geçersem bir const char** olmaz derleme Linux / OS X Nasıl yazabilirim bu kodu derler hem, olmadan kuvvete etmeye platform algılamak için?

Bir (başarısız) herhangi bir başlığı tarafından sağlanan geçersiz kılan yerel bir prototip sağlamak için sahip olduğum fikir:

void myfunc(void) {
    size_t iconv (iconv_t, char **inbuf);
    iconv(foo, ptr);
}

Bu iconv C bağlantı ihtiyacı nedeniyle başarısız olan bir fonksiyon içinde extern "C" (neden olmasın?)

Buldum en iyi çalışma fikri işlev işaretçisi kendini fırlatmak için:

typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);

ama bu maske diğer, daha ciddi hatalar potansiyeline sahiptir.

CEVAP
10 Temmuz 2012, Salı


Eğer istediğin sadece biraz sabit konulara göz yummak için ise, o zaman toplumsal hizmetler olan bir dönüşüm kullanabilirsiniz, yani** ve inş char** birlikte çalışabilir char yapar:

template<class T>
class sloppy {}; 

// convert between T** and const T** 
template<class T>
class sloppy<T**>
{
    T** t;
    public: 
    sloppy(T** mt) : t(mt) {}
    sloppy(const T** mt) : t(const_cast<T**>(mt)) {}

    operator T** () const { return t; }
    operator const T** () const { return const_cast<const T**>(t); }
};

Programda daha sonra:

iconv(c, sloppy<char**>(&in) ,&inlen, &out,&outlen);

() yarım yamalak char** const char* Bir bir alır ve char** veya iconv ikinci parametre talepleri her ne olursa olsun* *22,. bir dönüştürür

GÜNCELLEME: const_cast kullanın ve dökme olarak değil. özensiz çağrı değiştirildi

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Central

    Android Cent

    13 Kasım 2008
  • We've moved!

    We've moved!

    7 Ocak 2008
  • ThePhestor

    ThePhestor

    22 Mart 2011