2011-04-02 18 views
16

के साथ सी में एक से अधिक __attribute__ सी क्या आप जीसीसी के साथ सी में पहचानकर्ता को एक से अधिक विशेषता जोड़ सकते हैं? यहां मेरे पास अभी है। मैंने शामिल बयानों को छोड़ दिया क्योंकि वे पोस्ट में भटक गए। यदि दो जोड़ने का कोई तरीका है, तो सामान्य वाक्यविन्यास क्या है, और मैं इसे परिभाषा के साथ और प्रोटोटाइप के साथ कैसे कर सकता हूं? धन्यवाद। :-)जीसीसी

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

उत्तर

21

वहाँ जीसीसी के साथ सी में अनेक विशेषताएं निर्दिष्ट करने के दो अलग-अलग तरीके हैं:

#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"); 
} 

compiles ऊपर कोड और जीसीसी संस्करण 4.4.3 के तहत मेरे लिए सही ढंग से चलाता है।

+2

lol, pmg। अधिकांश समय मैं छोटे माइक्रोकंट्रोलर के साथ काम करता हूं, जहां वापसी मूल्य मुख्य() व्यर्थ है। किसी भी तरह से "शून्य मुख्य" कोड जीसीसी में चेतावनी के बिना संकलित किया गया है। लेकिन मैंने इसे आपको खुश करने के लिए एक int वापस करने के लिए बदल दिया :) –

+1

+1 - अब मैं खुश हूं, धन्यवाद @ डेविड। यदि आप '-Wall' (या केवल' 'Wmain') के साथ संकलित करते हैं, तो gcc 'void main' के बारे में शिकायत करेगा :) – pmg

+1

धन्यवाद :-), जो निश्चित रूप से मेरे प्रश्न का उत्तर देता है। – rubixibuc

2

आप रिक्त स्थान से अलग एकाधिक __attribute__ विनिर्देशकों का उपयोग कर सकते हैं।

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

यह मेरे प्रश्न का भी उत्तर देता है, लेकिन दो उत्तरों को स्वीकार नहीं कर सकता :-( – rubixibuc

+1

एनपी। ग्रेसन के पास यहां का जवाब है। – Heatsink