SORU
14 NİSAN 2015, Salı


İnt anlamı (*) (int *) = 5 (veya herhangi bir tamsayı değer)

Bunu çözemedim bir türlü:

int main() {
    int (*) (int *) = 5;
    return 0;
}

Yukarıdaki atama g c 11 ile derler. int (*) (int *) (int *) olarak tartışma ve döndürür int kabul eden bir işlev işaretçisi olduğunu biliyorum, ama 5'e eşit olabilir nasıl anlamıyorum. İlk düşündüğüm bir fonksiyon sürekli döner 5 (benim son öğrenme F#, muhtemelen, haha), sonra düşündüm, kısaca, bu işlev işaretçisi puan için bellek konumu 5, ama bu işe yaramazsa, açıkça, ve de öyle hex değerleri.

Bu fonksiyonu bir int döndürür çünkü olabilir, ve bir int atama Tamam (bir şekilde), ben de çalıştım bu olduğunu düşünüyorum

int * (*) (int *) = my_ptr

my_ptr tipi int * bu ikinci işlev işaretçisi olarak aynı tip olduğu, int ile birinci durumda. Bu derleme değil. 5, veya herhangi bir int değeri yerine my_ptr, atama bu işlev işaretçisi ya da derleme değildir.

Atama ne demek oluyor?

Güncelleme 1

En iyi cevap olarak gösterilen bir hata olduğunu teyit ettik. Ancak, hala aslında ne olduğu bilinmiyorolurişlev işaretçisi atamak veya atama ile ne değer. Bu konuda (iyi) herhangi bir açıklama yapmak çok mutluluk duyacağız! Daha fazlası için düzenlemeleri için aşağıya bakınız sorun net olarak lütfen.

1 düzenleyin

Gcc sürümü 4.8.2 (Ubuntu 4.8.2) kullanıyorum

2 düzenleyin

Aslında, hiçbir şey için kefeye benim derleyici çalışır. Hatta bir o kefeye std::string değişken veya bir çift döndüren bir işlev adı, çalışır.

Edit 2.1

İlginçtir, bir işlevi yapma gösterici bir veri türü döndüren bir işlev işaretçisi, derlemek izin gibi

std::string (*) () = 5.6;

Ama işlev işaretçisi bazı işaretçi döndüren bir fonksiyonu olarak, derleme değil, gibi

some_data_type ** (*) () = any_value;

CEVAP
14 NİSAN 2015, Salı


G bir hata .

 int (*) (int *) 

bir tür adıdır.

C olamaz tanımlayıcı olmadan bir tür adı ile bir bildiri var.

Bu g derler .

 int (*) (int *) = 5;

ve bu da derler:

 int (*) (int *);

ama her ikisi de geçersiz bildirimleri.

EDİT:

T.C. benzer bir test çalışması ile yorum bugzilla bug 60680 bahsederancak henüz onaylanmamıştır. Hata bugzilla onaylandı.

EDİT2:

İki bildirimleri yukarıda dosya kapsamında zaman g doğru bir tanı (blok kapsamında tanı sorunu başarısız) verir.

EDİT3:

Kontrol ettim ve sürüm 4 (4.9.2), en son ön sürüm Sürüm 5 (5.0.1 20150412) ve en son g deneysel sürüm 6 son sürümü (6.0.0 20150412) sorunu yeniden yapabilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • Bach Vlogs

    Bach Vlogs

    18 HAZİRAN 2011
  • kev5124

    kev5124

    9 Kasım 2008