Estoy trabajando con un sistema integrado, y estoy terminando con un montón de macros #define
que interactúan HW. Quiero poner todos estos en un archivo separado (para OOP-ness), pero no sé la mejor manera de #include
que. ¿Acabo de ponerlos todos en un archivo .c, y luego incluir eso? Parece tonto poner estos en un archivo .h.¿Dónde pongo todas estas funciones, como #defines, en C?
Respuesta
No veo nada malo con el archivo .h.
Sí, esta es una práctica estándar. – caf
Bueno, la regla general es que los prototipos de funciones residen en archivos .h y sus implementaciones en archivos .c. En este caso, pondría las implementaciones en los archivos .h, normalmente no donde alguien los buscaría. – Tristan
@Tristan: lo que es cierto para las funciones no es necesariamente cierto para las macros; también es común que las funciones en línea residan en los archivos de encabezado – Christoph
Deben ir en los archivos .h
. La otra opción es un archivo .c
, y eso requeriría el uso de #include
para incluir un archivo .c
, lo que definitivamente confundirá a las personas, además de confundir su archivo MAKE, si utiliza la suposición estándar de que cada archivo .c
corresponderá directamente a un archivo compilado .o
archivo.
El patrón normal es que los archivos .h
son para cosas que están incluidas en otros lugares (y, particularmente, en muchos otros lugares), y que los archivos .c
son para cosas compiladas una vez en archivos de objeto.
Por lo tanto, las siguientes cosas que normalmente entran en .h
archivos:
- prototipos de función
- declaraciones de constantes
- variable global
extern
declaraciones función
- Inline Definiciones de
- definiciones de tipo
- y definiciones macro, como lo que estás preguntando acerca de.
Por el contrario, las siguientes cosas que normalmente entran en .c
archivos:
- definiciones de variables globales
- Las definiciones de funciones que serán compilados en código objeto y vinculados
El caso de " las definiciones de funciones solo entran en los archivos .c
"es simplemente el caso degenerado cuando no tiene ninguna función en línea.
En C++, donde la gran cantidad de funciones se definen en forma de plantilla y por lo tanto las definiciones deben ser incluidos cada vez que son utilizados, esas definiciones muy a menudo van en la .h
(o .hpp
, o lo que sea) de archivos. Entonces este tipo de cosas definitivamente tiene un precedente.
No estoy necesariamente recomendando esto, pero lo he visto en bastantes proyectos integrados en los últimos 10 años: incluye funciones en línea como .inl.
Brooks no tiene ninguna responsabilidad. Es posible considerar la separación de línea y definiciones de las macros de prototipos de las funciones ordinarias y tal:
#include "prototypes.h"
#include "macros.inl"
int foo(void);
int bar(char);
Su objetivo final es la consistencia: las decisiones de diseño deben ayudar a los que se tenga éxito.
Colóquelos donde los necesite.
Si lo necesita solo para un archivo, colóquelo en la parte superior de ese archivo.
Si lo necesita para varios archivos, colóquelo en un archivo de encabezado.
- 1. ¿Dónde puedo encontrar las implementaciones nativas de estas funciones?
- 2. ¿Dónde pongo una función XSL en un documento XSL?
- 3. ¿Dónde pongo META-INF en Eclipse?
- 4. ¿Dónde se han ido todas las funciones simples en WebGL?
- 5. Como hacer funciones en línea en C#
- 6. ¿Dónde pongo la etiqueta de script jQuery?
- 7. ¿Dónde pongo métodos de ayuda para las vistas de ActionMailer?
- 8. ¿Dónde pongo el código de limpieza en una aplicación Flask?
- 9. ¿Es así como defines una función en jQuery?
- 10. ¿Cuál es la diferencia entre estas funciones?
- 11. Dónde pongo métodos comunes en la aplicación MVC
- 12. ¿Dónde pongo el código de inicio en Play Framework?
- 13. ¿Dónde pongo RewriteRules en Apache2 sin usar archivos .htaccess?
- 14. ¿Dónde deberían colocarse las funciones Symfony "globales"?
- 15. ¿Por qué usar C typedefs en lugar de #defines?
- 16. dónde almacenar funciones auxiliares?
- 17. ¿Dónde pongo el archivo de constantes para Codeigniter (PHP)?
- 18. ¿Cómo y dónde defines tu propia jerarquía de excepciones en Java?
- 19. ¿Cómo debería estructurar una aplicación Java? ¿Dónde pongo mis clases?
- 20. ¿De dónde vienen estas carpetas con nombre hexadecimal?
- 21. ¿Dónde pongo mi código backend de falla resque-retry?
- 22. ¿Dónde pongo mi declaración de delegado C# en un archivo propio?
- 23. Acceso a recursos multiproceso: ¿dónde pongo mis bloqueos?
- 24. ¿De dónde viene el espacio extra en estas imágenes?
- 25. ¿La mejor práctica para dependencias en #defines?
- 26. ¿Dónde pongo mi archivo jetty.xml con Jetty embedded?
- 27. ¿Es D lo suficientemente potente para estas funciones?
- 28. Funciones recursivas en C/C++
- 29. C# Expresiones lambda como argumentos de funciones
- 30. Scrum: ¿dónde haces todas las "otras" cosas?
FWIW: Se llaman "macros", no "funciones". – dmckee
¿Por qué parece tonto ponerlos a todos en un archivo .h? – FrustratedWithFormsDesigner
@dmckee: podemos dividir la diferencia y llamarlos "macros funcionales" en lugar de "macros similares a objetos", los términos utilizados en el estándar. –