Estaba leyendo la documentación de GCC sobre los atributos de funciones de C y C++ . En la descripción de los atributos de error y warning , la documentación menciona casualmente el siguiente "truco":
error ("message")
warning ("message")Si el atributo de
errorowarningse utiliza en una declaración de función y no se elimina una llamada a dicha función mediante la eliminación de código muerto u otras optimizaciones, se diagnostica un error o advertencia (respectivamente) que incluye un mensaje . Esto es útil para la verificación en tiempo de compilación, especialmente junto con__builtin_constant_py funciones en línea donde no es posible verificar los argumentos de la función en línea a través deextern char [(condition) ? 1 : -1];trucos.Si bien es posible dejar la función sin definir y así invocar una falla de enlace (para definir la función con un mensaje en la sección
.gnu.warning*), al usar estos atributos, el problema se diagnostica antes y con la ubicación exacta de la llamada incluso en presencia de funciones en línea o cuando no se emite información de depuración.
No hay más explicación. Tal vez sea obvio para los programadores inmersos en el entorno, pero para mí no lo es en absoluto, y no pude encontrar ninguna explicación en línea. ¿Qué es esta técnica y cuándo puedo usarla?
Creo que la premisa es tener una funcionalidad de afirmación de tiempo de compilación. Supongamos que escribiste
extern char a[(condition) ? 1 : -1]; Si la condition es true , no pasa nada y la línea se compila en nada. El extern se asegura de que a no use ninguna memoria. Sin embargo, si condition es false , a se declara como una matriz de longitud negativa y obtiene un error de tiempo de compilación.
Probablemente lo envuelva en una macro y tenga algo similar a static_assert
#define STATIC_ASSERT(condition) extern char a[(condition) ? 1 : -1]