Guía GNU C `__atributo__`

Patrones y ejemplos de uso comunes de GNU C `__attribute__`.

Sintaxis

1
__attribute__((attribute-list))

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.

1
2
3
4
struct __attribute__((packed)) packed_str {
    uint8_t x;
    uint16_t y;
};

Ú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.

1
int buf[16] __attribute__((aligned(64)));

sección("nombre")

Coloca la variable/función en una sección del vinculador personalizado.

1
const char fw_ver[] __attribute__((section(".fwinfo"))) = "1.0.0";

sin usar

Suprime las advertencias no utilizadas.

1
static void helper(void) __attribute__((unused));

débil

Declara un símbolo débil (puede anularse mediante una definición fuerte).

1
void board_init(void) __attribute__((weak));

sin retorno

Función de marcas que nunca regresa.

1
void fatal_error(void) __attribute__((noreturn));

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.

记录并分享
Creado con Hugo
Tema Stack diseñado por Jimmy