2014-10-02 41 views
45

, this question cevabım itibaren ardından hem C++ 11 ve C++ 14:C++ 11 ve C++ 14'de "bsearch" ifadesi bozuk mu?

:

[C++11, C++14: 25.5/2]: içeriği Standart C kütüphanesi başlığında aşağıdaki istisnalarla <stdlib.h> aynıdır [C++11, C++14: 25.5/3]: işlev imzası:

:

bsearch(const void *, const void *, size_t, size_t, 
     int (*)(const void *, const void *)); 

iki bildirimleri ile değiştirilir Her ikisi de orijinal deklarasyonla aynı davranışa sahip olan

. Ancak

,

[C++11, C++14: 7.5/5]: iki bildirim aynı ad üyesi olabilir veya aynı isme sahip nesneleri açıklamak için aynı isim ve parametre tip listesine (8.3.5) ile işlevlerini bildirmek durumunda Aynı isim alanından üyeler olmak ve beyannameler farklı dil bağlantıları isimleri vermek, program kötü biçimlendirilmiş; Bildirimler farklı çeviri birimlerinde görünürse hiçbir teşhis gerekmez. [..]

Bu bir kusur mu?

+0

Yanıt, bu argümanların aynı argümanlara sahip olup olmadığı ile ilgili olarak menteşeler. Eğer bağlantı türün bir parçasıysa, 'karşılaştır' her iki örnekte de farklı bir türe sahiptir ... eğer olsa, bunu türler için ilan etmenin kolay bir yolunu istiyorum ve hiçbirinin farkında değilim. – Deduplicator

+0

@Deduplicator Standart C++ 'da, şablon takma adlarından faydalanabilirsiniz. 'template kullanarak CxxFunc = R (T ...); extern "C" {template kullanarak CFunc = R (T ...); } '. CFunc ve CxxFunc <...> 'olarak karşılaştırır.Çoğu uygulama, 'extern' C 'bloklarındaki şablonlara izin vermediği için reddeder, ancak bu kesinlikle geçerlidir. Kısıtlama, bir şablonun "extern" C "bağlantısına sahip olamamasıdır, bir şablon" extern "C" bloğunda görünemez. Bir şablon takma adında dil bağlantısı yok, bu yüzden sorun yok. – hvd

+1

C++ 98'de aynı şekilde 25.4/3 (ve qsort için 25.4/4) – Cubbi

cevap

49

Ancak parametre türleri listesi aynı değil. Birinde, compar, "C" dil bağlantısı olan bir işlevin bir göstericisidir, diğerinde, "C++" dil bağlantısı olan bir işlevin işaretçisi olur.

C++ 11

, 7.5 belirtir: farklı bir ifade ile

1 ... iki fonksiyon tipi bağlantılar aksi aynı olsa bile farklı tipi vardır. Bir bağlantı-tarifnamede

4, belirtilen dil bağlantı fonksiyonu tüm işlev declarators türleri, dış bağlantı ile işlev adları ve bağlantı şartname içinde bildirilen dış bağlantısı ile değişken isimleri için de geçerlidir. [Örnek:

fonksiyonu tip 1 görüşmeler, 5 adresleri isim işlev ise bu gerçekleştirirken 7.5/1 ve 7.5/5 arasında görünen tutarsızlık çözüldü
extern "C" void f1(void(*pf)(int)); 
// the name f1 and its function type have C language 
// linkage; pf is a pointer to a C function 

.

+0

İlk fp'nin C++ ve ikinci C bağlantısının, iki işlev beklediği bir işlev için olduğunu bildirmenin kolay bir yolu var mı? işaretçiler? – Deduplicator

+0

@Deduplicator İçerdiği fonksiyonun dil bağlantısından farklı olan parametre için bir "typedef" kullanın. – Angew

+4

Ne clang ++ ne de g ++ onları farklı olarak görüyor. http://coliru.stacked-crooked.com/a/ceb69c605e32832d – Deduplicator