Funciones macro vs. estáticas en el encabezado

9

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.

wirrbel
fuente
44
Creo que su pregunta podría haber sido respondida aquí stackoverflow.com/questions/9104568/macro-vs-function-in-c y aquí stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru
escribiendo una macro adecuada es un dolor, y inlinede 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 espacio
trinquete monstruo
2
En realidad sospecharía que la mayoría de estos son motivos históricos. Hace años, los compiladores de C no incluían funciones en línea. Entonces la gente usaba macros para las cosas que querían en línea. El código C suele ser inusualmente longevo.
Jan Hudec
@ratchetfreak: C no tiene inline, no se trata de C ++.
wirrbel
2
@wirrbel Por supuesto que hay inlineen C, al menos desde C99. Para obtener una descripción general rápida, consulte Wikipedia sobre funciones en línea .
amon

Respuestas:

6

Las macros que se pueden resolver mediante una llamada a función tienen muchas dificultades:

  • Son difíciles de escribir, porque es posible que tenga que manejar adecuadamente los argumentos como ++i.
  • Son difíciles de depurar con un depurador visual ya que no puede pasar por una macro o poner un punto de interrupción allí.
  • Son difíciles de manejar correctamente al analizar dependencias de compilaciones.

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.

Por lo general, las funciones C no están en línea, ya que pueden estar vinculadas desde otros archivos C.

No hay ninguna razón por la cual un compilador no pueda proporcionar dos versiones de una función, una called tradicional y una inlined. 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).

usuario40989
fuente