Sintaxis
|
|
attribute-list es una lista de atributos separados por comas.
Atributos comunes
empaquetado
Elimina el relleno de la estructura predeterminada y minimiza los espacios de alineación.
|
|
Úselo con cuidado: el acceso no alineado puede reducir el rendimiento o causar fallas en algunas arquitecturas.
alineado(n)
Fuerza la alineación del objeto a n bytes.
|
|
sección("nombre")
Coloca la variable/función en una sección del vinculador personalizado.
|
|
sin usar
Suprime las advertencias no utilizadas.
|
|
débil
Declara un símbolo débil (puede anularse mediante una definición fuerte).
|
|
sin retorno
Función de marcas que nunca regresa.
|
|
Notas
__attribute__es específico del compilador (compatible con GCC/Clang en muchos casos).- Prefiere macros para mayor portabilidad cuando apunta a múltiples compiladores.
Notas prácticas
__attribute__ es una extensión de GNU C, por lo que su disponibilidad depende del compilador.
En proyectos portables conviene encapsular estos atributos con macros, por ejemplo PACKED, WEAK o ALIGNED(x), y definirlas solo cuando se compile con GCC o Clang.
Así el mismo código puede compilarse en otros toolchains con una degradación controlada.
También es importante distinguir entre atributos aplicados a funciones, variables y tipos. Un atributo colocado en la posición incorrecta puede no producir el efecto esperado, o incluso ser ignorado con una advertencia del compilador. Cuando se use en firmware o código de bajo nivel, revisa siempre el mapa de memoria, el desensamblado o la salida del enlazador para confirmar que el resultado coincide con la intención.
used
Este atributo se aplica a variables con almacenamiento estático.
Indica al compilador y al enlazador que el símbolo debe conservarse aunque parezca no estar referenciado.
Es útil en firmware, tablas de registro, vectores, metadatos de versión o símbolos que serán leídos por scripts de enlace, bootloaders o herramientas externas.
Más sobre weak
Cuando dos símbolos globales tienen el mismo nombre y uno de ellos se declara como weak symbol, no se genera un error de redefinición.
Si existe un símbolo normal, el enlazador usa el símbolo normal e ignora el débil; si no existe, usa la implementación débil.
Esto permite implementar callbacks predeterminados, hooks de placa y funciones que el usuario puede sobrescribir.