2011-04-02 46 views
16

Gcc ile bir tanımlayıcısına birden fazla öznitelik ekleyebilir misiniz? İşte şimdi sahip olduğum şey. Gönderi ifadelerini dışarıda bıraktım çünkü yazıya karışıyorlar. İki tane eklemenin bir yolu varsa, genel sözdizimi nedir ve bunu hem açıklamayla hem de bir prototiple nasıl yapabilirim? Teşekkür ederim. :-)Gcc ile birden fazla __attribute__ birden fazla gc

main() { 
    printf("In Main\n"); 
} 
__attribute__ ((constructor)) void beforeMain(void) 
{ 
    printf("Before Main\n"); 
} 

cevap

21

iki farklı GCC ile C çoklu özelliklerini belirtme yolu vardır:

#include <stdio.h> 

// Attributes in prototypes: 
__attribute__((constructor, weak)) void beforeMain(void); 
__attribute__((constructor)) __attribute__((weak)) void beforeMain2(void); 

int main(){ 
    printf("In Main\n"); 
    return 0; 
} 

// Attributes in definitions: 
__attribute__((constructor, weak)) void beforeMain(void){ 
    printf("Before Main 1\n"); 
} 

__attribute__((constructor)) __attribute__((weak)) void beforeMain2(void){ 
    printf("Before Main 2\n"); 
} 

derlemesinin Yukarıdaki kod ve gcc sürümü 4.4.3 altında benim için doğru çalışır.

+2

lol, pmg Çoğu zaman küçük mikrodenetleyicilerle çalışıyorum. main() anlamsızdır. Bir şekilde "geçersiz ana" kod GCC'de bir uyarı olmadan derlenmiştir. Ama ben seni mutlu etmek için bir int dönmesi için değiştirdim :) –

+1

+1 - Şimdi mutluyum, teşekkürler @David. Eğer '-Wall' ile derlerseniz (ya da sadece '-Wmain'), gcc' void main 'hakkında şikayet edecektir :) – pmg

+1

Teşekkür ederim :-), bu kesinlikle sorumu cevaplar. – rubixibuc

2

Boşluklarla ayrılmış birden fazla __attribute__ belirteçleri kullanabilirsiniz.

char s[3] __attribute__((aligned(32))) __attribute__((weak)); 
+0

Bu benim de yanıtlarımı yanıtlar, ancak iki yanıtı kabul edemez :-( – rubixibuc

+1

np Grayson burada bir cevap verir. – Heatsink