SORU
11 NİSAN 2014, Cuma


Derler g ile garip kod

Aşağıdaki kodu başarıyla g 4.8.1 derler:

int main()
{
    int(*)();
}

İşlev işaretçisi basit bir beyan gibi görünüyor:

int(*f)();

Çınlama 3.4 ve vc 2013 derleme değil.

Derleyici bir hata ya da standart karanlık yerlerden biridir?


G 4.8.1 ile iyi bir derleme olan benzer garip bir kod listesi adet (güncellenir)

  1. int(*)();

  2. int(*);

  3. int(*){};

  4. int(*());

Live example with these strange code pieces.

Güncelleme 1:@Ali yorum bazı ilginç bilgiler ekledi:

Tüm 4 kasa ise 3.5 gövde ile hata (202594) derleme ve derleme gcc 4.9 ile iyi bir gövde (20140302) ver. Bu davranış anlaşılabilir; genişletilmiş başlatıcı listeleri olan -std=c 98 -pedantic, int(*){}; hariç ile aynı -std=c 11 ile kullanılabilir.

Güncelleme 2:@CantChooseUsernames onlar hala iyi başlatma bile derleme his answer 'de belirtildiği gibi ve hiçbir Meclis g tarafından oluşturulur (başlatma ne de olmasa bile herhangi bir etkin optimizasyon olmadan:

  1. int(*)() = 0;

  2. int(*) = 0;

  3. int(*){} = 0;

  4. int(*()) = 0;

Live example with initializations.

Güncelleme 3:Gerçekten int(*)() = "Hello, world!"; güzel, çok int(*p)() = "Hello, world!"; elbette derleme olmasa da () derler bulmak için şaşırdım.

Güncelleme 4:Muhteşem bir şey ama int(*){} = Hello, world!; güzel derler. Ve kod son derece garip, aşağıdaki parça da: int(*){}() = - */%&|^~.,:!?$()[]{}; (live example).

CEVAP
11 NİSAN 2014, Cuma


C Standart (s. göre Bölüm 7 Bildirimleri #6)

6 Her init-Bildiricisi init-Bildiricisi listesitam olarak içerir bir kimliği Bildiricisiadını tarafından ilan edilen , ınit-Bildiricisi ve isimleri beyannamesi ile beyan edilen şartları

Sadece derleyici bir hata.

Geçerli kod benim MS 2010 VC ile derleme yapamam ama örnek (fonksiyon işaretçi bildirimi ile gösterdi hariç) olarak görünebilir.

int(*p){};

Test için kullandığınız derleyici Bildiricisi-kimlik olmadan bildirimleri sağlar gibi görünüyor.

Ayrıca hesaba bölüm 8.1 Tür isimleri aşağıdaki paragraf

Tip dönüşümleri açıkça belirtmek İçin 1, bağımsız değişken olarak boyutu, alignof, yeni veya typeidbir tür adı olacaktır belirtildi. Bu sözdizimsel olarak hangi tür kimlik ile yapılabilir atlar bu tür değişken veya işlev bildirimi varlık adı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • kremosakhaz

    kremosakhaz

    25 AĞUSTOS 2006
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008