2012-05-16 32 views
6

Bugün bir süre önce geliştirdiğim bir proje üzerinde clang denedim. Bir derleme hatasıyla karşılaştığında şaşırdım, çünkü projemi g ++ kullanarak başarıyla derledim. Bu hatayı üretirg ++ 'da __attribute__ kullanılarak dengesiz parantez.

int main() { 
    __attribute__((aligned(16)) char arr[5]; 
} 

:

test.cpp:2:32: error: expected ')' 
    __attribute__((aligned(16)) char arr[5]; 
          ^
           ) 

Gördüğünüz gibi, bir umbalanced parantez var

Bu kısa pasajı hatası ile karşılaşıldı hattını yeniden üretir. Üç tane '(' ve iki ') var. Bu açıkça bir derleme hatası üretmesi gerektiği gibi görünüyor.

Bu anahtar kelimenin geçerli bir kullanımı var mı? Olduğunu gösteren the documentation'da bir şey bulamıyorum.

G ++ 4.5.2 ve clang 2.8 kullanıyorum. g yerine gcc kullanırken bu hata ++ tespit edildiği

not edin.

+0

devletler . * * Bu anahtar kelimeyi çift parantez içinde bir özellik belirtimi izler "***. Bu nedenle, aynı sayıda parantez ile kapatma hakkında kesin açık sözlü kelimeler söylemez, ancak tüm gcc örnekleri eşleşen parantezi gösterir, böylelikle bir hataya benzer. –

+0

Evet, aslında bir böcek gibi görünüyor. Tam tersini gösterebilecek bir şey bulamıyorum. – mfontanini

+0

@ DavidRodríguez-dribeas clang bunu destekliyor. Yani, g ++, bu açıklamayı doğru şekilde ayrıştırmıyor gibi görünüyor. clang doğru şeyi yapıyor (en azından şüpheliyim ki ... bu yüzden soruyorum: D) Burada bir hata bildirirken. '++ g üzerinde doğru derleyici hata veriyor – mfontanini

cevap

3

Bu bir derleyici hatası olur. derleyici __attribute__ muhtemelen __attribute__, örneğin gibi görünmesi gerektiğine dair “ tanımı ” iki açılış parantez, diğer bazı jeton ve daha sonra iki kapanış parantez, ardından görür

<attribute> ::= __attribute__ '((' something '))'

Benim tahminim aradaki belirteçleri aligned(16 olarak ve hala çalışıyor bir mucize yorumlanır ediliyor olmasıdır.

[gcc belgeler] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) Eğer değişkenler veya yapı alanlarının özel özelliklerini belirlemenizi sağlar __attribute__` * "anahtar kelimesini`
+0

Mükemmel Sadece gcc en Bugzilla'da üzerinde bir hata olarak bu rapor ettik – mfontanini

+0

Evet, muhtemelen vardır; – mfontanini

+2

bir böcek olmayabilir, dengesiz parantez hemen hemen hiç istediğini çünkü o benim gözümde, ancak GCC herhangi bir tür belirleyicinin '((' ve ')' 'içinde görünmesine izin veriyorsa, o zaman bir hata olarak düşünülemez. __attribute __ ((((((())' yi deneyin ve dengesiz parantez yerine bilinmeyen öznitelik – dreamlax

İlgili konular