La mejor manera de generar un error de tiempo de enlace para las funciones en desuso que no desea que las personas usen es asegurarse de que las funciones obsoletas no estén presentes en las bibliotecas, lo que las hace una etapa más allá de 'obsoleta'.
Tal vez pueda proporcionar una biblioteca auxiliar con la función en desuso; los réprobos que no prestarán atención pueden vincularse con la biblioteca auxiliar, pero las personas en general no utilizarán la biblioteca auxiliar y, por lo tanto, no usarán las funciones. Sin embargo, todavía lo está llevando más allá de la etapa 'en desuso'.
Obtener una advertencia de tiempo de enlace es complicado. Claramente, GCC lo hace para alguna función (mktemp()
y otros), y Apple ha advertido a GCC si ejecuta un programa que usa gets()
. No sé lo que hacen para que eso suceda.
A la luz de los comentarios, creo que es necesario ir hacia el problema fuera en tiempo de compilación, en lugar de esperar hasta el tiempo de enlace o en tiempo de ejecución.
Los atributos del CCG incluyen (en el manual de GCC 4.4.1):
error ("message")
Si se utiliza este atributo en una declaración de función y una llamada a una función de este tipo se no eliminan a través de código muerto eliminación u otras optimizaciones, se diagnosticará un error que incluirá el mensaje. Esto es útil para el tiempo de compilación comprobando, especialmente junto con __builtin_constant_p y las funciones en línea donde no es posible verificar los argumentos de la función en línea mediante extern char [(condición)? 1: -1]; trucos. Si bien es posible dejar la función indefinida y, por lo tanto, invocar un error en el enlace, al usar este atributo se diagnosticará el problema anteriormente 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.
warning ("message")
Si se utiliza este atributo en una declaración de función y una llamada a una función de este tipo es no se elimina a través de la eliminación de código muerto o otras optimizaciones, una advertencia que incluirá mensajes serán diagnosticados. Esto es útil para comprobar en tiempo de compilación , especialmente junto con __builtin_constant_p y las funciones en línea. Si bien es posible definir la función con un mensaje en .gnu.advertencia * sección, cuando se usa este atributo, el problema se diagnosticará antes y con la ubicación exacta de la llamada, incluso en presencia de funciones en línea o cuando no esté emitiendo información de depuración.
Si los programas de configuración ignoran los errores, simplemente se rompen. Esto significa que el nuevo código no se pudo compilar utilizando las funciones, pero el código existente puede seguir utilizando las funciones en desuso en las bibliotecas (hasta que sea necesario recompilarlo).
Las advertencias se pueden hacer con el 'nota .gnu.warning', pero No conozco un equivalente para generar errores. Desafortunadamente, si bien su solución es la mejor, no satisface mis necesidades de combinar tanto un ABI en desuso como vincular nuevas aplicaciones. –
@R ..: suficiente. ¿Es justo decir que desea una copia de las bibliotecas instaladas; desea que las aplicaciones compiladas previamente (que pueden estar usando la interfaz en desuso) continúen ejecutándose; ¿Desea que las nuevas aplicaciones compiladas que usan la interfaz obsoleta no se vinculen? Si es así, y si los detectores de configuración detectarán las funciones obsoletas, ¿cómo planea que la gente arregle las cosas para que el código termine enlazando con las interfaces modernas (no desaprobadas)? –
No hay una nueva interfaz de reemplazo; tratar de usar estas interfaces obsoletas es simplemente dañino, y el comportamiento correcto es no usarlas en absoluto.Lamentablemente, no tengo control sobre el software defectuoso que está tratando de usarlos, y aunque probablemente logre que los mantenedores arreglen nuevas versiones, los usuarios podrían estar intentando compilar versiones antiguas por un buen tiempo. –