2011-04-02 5 views
16

¿Puede agregar más de un atributo a un identificador en C con gcc? Esto es lo que tengo ahora. Olvidé las declaraciones de inclusión porque se pelean en la publicación. Si hay una manera de agregar dos, ¿cuál es la sintaxis general, y cómo puedo hacerlo tanto con la definición como con un prototipo? Gracias. :-)Más de una __tribución__ en C con gcc

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

Respuesta

21

Hay dos maneras diferentes de especificación de varios atributos en C con GCC:

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

el código anterior se compila y se ejecuta correctamente para mí bajo la versión de gcc 4.4.3.

+2

lol, pmg. La mayoría de las veces trabajo con microcontroladores pequeños, donde el valor de retorno de main() no tiene sentido. De alguna manera el código "void main" compilado sin una advertencia en GCC. Pero lo cambié para devolver un int para hacerte feliz :) –

+1

+1 - Estoy feliz ahora, gracias @David. Si compila con '-Wall' (o solo' 'Wmain'), gcc se quejará de' void main' :) – pmg

+1

Gracias :-), eso definitivamente responde mi pregunta. – rubixibuc

2

Puede usar varios especificadores __attribute__ separados por espacios.

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

Esto también responde mi pregunta, pero no puedo aceptar dos respuestas :-( – rubixibuc

+1

np. Grayson tiene la respuesta más completa aquí – Heatsink

Cuestiones relacionadas