SORU
17 Temmuz 2013, ÇARŞAMBA


Bir " C;türü şeffaf class"?

Gcc ondalık veri türleri için destek içeren bir programı derlemek için, geçenlerde aşağıdaki hata ile karşılaştı:

error: type transparent class 'std::decimal::decimal32' has base classes

GCC kaynak ağacı hızlı bir göz bu hata iletisini gcc/cp/class.c içinde bulunduğunu göstermektedir.

Bir "tip şeffaf sınıf"? Neden böyle bir sınıf için bir hata olur "temel sınıflar"?

CEVAP
17 Temmuz 2013, ÇARŞAMBA


Biraz daha, GCC kaynak kodu semantics.c okuma:

  if (TREE_CODE (t) == RECORD_TYPE
      && !processing_template_decl)
    {
      tree ns = TYPE_CONTEXT (t);
      if (ns && TREE_CODE (ns) == NAMESPACE_DECL
          && DECL_CONTEXT (ns) == std_node
          && DECL_NAME (ns)
          && !strcmp (IDENTIFIER_POINTER (DECL_NAME (ns)), "decimal"))
        {
          const char *n = TYPE_NAME_STRING (t);
          if ((strcmp (n, "decimal32") == 0)
              || (strcmp (n, "decimal64") == 0)
              || (strcmp (n, "decimal128") == 0))
            TYPE_TRANSPARENT_AGGR (t) = 1;
        }
    }

Bu kod, bir tür şeffaf eğer işaretli olduğunu gösterir

  • Bir yapı, ama bir şablon değil
  • Ve ad alanı düzeyinde olduğunu, ve o ad std::decimal.
  • Ve decimal32, decimal64 decimal128 adlandırılmıştır.

class.c karşılaştı, ve bir kaç hata kontrolü yoktur.

Ve mangle.c:

      /* According to the C   ABI, some library classes are passed the
         same as the scalar type of their single member and use the same
         mangling.  */
      if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
        type = TREE_TYPE (first_field (type));

Yorum anahtarı burada. Saydam bir tür ilk üye her yerde kullanılabilir (ve sadece) yumruk üye türü için değiştirilir anlamına gelir bence. Örneğin, benim include/decimal sınıfı std::decimal::decimal32 bir tek alan türü __decfloat32 (bir önceki typedef float __decfloat32 __attribute__((mode(SD)));), yani herhangi bir işlevi alır __decfloat32 can almak std::decimal::decimal32 ve tersi. Hatta işlev dekorasyon aynı yapılır. Fikri muhtemelen bu sınıflar C türleri _Decimal32, _Decimal64 _Decimal128 ile uyumlu ABİ.

Şimdi, nasıl temel dersleri class decimal32 bir alıyor musun? Sadece benim tahminim uyumsuz (belki daha eski) başlık dosyaları, tamamen farklı bir uygulama ile dahil olmasıdır.

GÜNCELLEME

Biraz araştırmadan sonra, benim ABİ hakkında bir tahmin gibi görünüyor ve işlevi, dekorasyon haklı. Aşağıdaki kodu:

#include <decimal/decimal>
using namespace std::decimal;

 //This is a synonym of C99 _Decimal32, but that is not directly available in C  
typedef float Decimal32 __attribute__((mode(SD)));

void foo(decimal32 a) {}
void foo(Decimal32 a) {}

verir merak hatası:

/tmp/ccr61gna.s: Assembler messages:
/tmp/ccr61gna.s:1291: Error: symbol `_Z3fooDf' is already defined

Yani, derleyici ön uç aşırı hiçbir sorun görür ve sembolik makina kodunu gösterir, ama her iki işlevi aynı dekore edilmiştir beri çevirici başarısız olur.

Şimdi, bu Ben Voigt yorum da anlaşılacağı gibi GCC olmayan uygunluğu nedir? İstediğiniz herhangi iki farklı aşırı yüklenmiş fonksiyonlar yazmak gerekir bilmiyorum. Ama OTOH, imkansız biraz derleyici uzantısı kullanmadan Decimal32 türü elde etmek için, bu tür anlamı uygulanması tanımlanır

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★TheCrono Official Channel★

    ★TheCrono

    3 Mayıs 2014
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • National Geographic

    National Geo

    7 Mayıs 2006