para muchas tareas rápidas en las que se podría emplear una función f(x,y)
, en C simple, se usan macros. Me gustaría preguntar específicamente sobre estos casos, que se pueden resolver mediante una llamada a la función (es decir, macros utilizadas para incluir funciones, no para la expansión de código de código arbitrario).
Por lo general, las funciones C no están en línea, ya que pueden estar vinculadas desde otros archivos C. Sin embargo, las funciones C estáticas solo son visibles desde el archivo C en el que están definidas. Por lo tanto, los compiladores pueden incorporarlas. He oído que muchas macros deberían reemplazarse convirtiéndolas en funciones estáticas, porque esto produce un código más seguro.
¿Hay casos en que esta no sea una buena idea?
Nuevamente: no preguntar sobre macros de Code-Production con ## construcciones similares que no se pueden expresar como una función.
inline
de fu simplemente asegura que puede ser definida varias veces en el binario, el compilador puede determinar si se propone de hecho en línea que puede que ahorran espacioinline
, no se trata de C ++.inline
en C, al menos desde C99. Para obtener una descripción general rápida, consulte Wikipedia sobre funciones en línea .Respuestas:
Las macros que se pueden resolver mediante una llamada a función tienen muchas dificultades:
++i
.Las macros que se pueden resolver mediante una llamada a la función podrían haber sido útiles para proporcionar la alineación en un compilador primitivo. No conozco ningún compilador que no maneje funciones en línea y algunos incluso pueden conectarse en línea a través de unidades de compilación.
No hay ninguna razón por la cual un compilador no pueda proporcionar dos versiones de una función, una
call
ed tradicional y unainline
d. Debe consultar la documentación del compilador al que se dirige. Además, es posible que desee ver el ensamblaje generado: incluso si no conoce el ensamblaje, puede aprender rápidamente a saber si alguna función ha sido incorporada o no. (Comience con ejemplos de bebés para aprender esto rápidamente).fuente