2010-05-26 8 views
9

Tengo una pregunta C/C++, ¿puedo volver a utilizar funciones en diferentes archivos de objetos o proyectos sin escribir los encabezados de función dos veces? (uno para definir la función y otro para declararlo)Formas de no escribir encabezados de funciones dos veces?

No sé mucho sobre C/C++, Delphi y D. Supongo que en Delphi o D, simplemente escribiría una vez los argumentos que toma una función y entonces puedes usar la función en diferentes proyectos. Y en C, necesita la declaración de la función en los archivos de encabezado * nuevamente ??, ¿no ?. ¿Hay una buena herramienta que creará archivos de encabezado de fuentes de C? Tengo uno, pero no es consciente del preprocesador y no es muy estricto. Y he tenido alguna técnica macro que funcionó bastante mal.

Busco formas de programar en C/C++ como se describen aquí http://www.digitalmars.com/d/1.0/pretod.html

+1

No sé cómo funciona D en esta área, pero en Delphi si está escribiendo una unidad que contiene rutinas que serán llamadas por otras unidades y programas, tiene que escribir el procedimiento y las declaraciones de funciones dos veces, una vez la sección de interfaz, luego otra vez con la rutina real en la sección de implementación. Delphi IDE proporciona algo de ayuda con esto, pero finalmente depende del programador asegurarse de que permanezcan sincronizados. El compilador sin duda le avisará cuando no estén sincronizados. No es difícil mantener esto, es parte del trabajo de un programador saber qué está haciendo el código. – Todd

+0

'D' se ve más cerca de Java o C# que de C++. – egrunin

Respuesta

11

En mi humilde opinión, la generación de las cabeceras de la fuente es una mala idea y es poco práctico.

Los encabezados pueden contener más información que solo los nombres y parámetros de las funciones.

Éstos son algunos ejemplos:

  • una cabecera C++ puede definir una clase abstracta para el que un archivo de origen puede ser que no sean necesarios
  • Una plantilla sólo se puede definir en un archivo de cabecera
  • por defecto los parámetros solo se especifican en la definición de clase (por lo tanto, en el archivo de encabezado)

Por lo general, usted escribe r encabezado, luego escriba la implementación en un archivo fuente correspondiente.

Creo que hacerlo al revés es contrario a la intuición y no encaja con el espíritu de C o C++.

La única excepción es que puede ver que es funciones estáticas. Una función estática solo aparece en su archivo de origen (.c o .cpp) y no puede (obviamente) utilizarse en otro lugar.

Aunque estoy de acuerdo en que a menudo es molesto copiar la definición del encabezado de un método/función al archivo fuente, probablemente pueda configurar su editor de código para facilitar esto. Yo uso Vim y una secuencia de comandos rápida me ayudó con este mucho. Supongo que existe una solución similar para la mayoría de los otros editores.

De todos modos, si bien esto puede parecer molesto, tenga en cuenta que también le da una mayor flexibilidad. Puede distribuir sus archivos de encabezado (.h, .hpp o lo que sea) y luego, de forma transparente, cambie la implementación en los archivos de origen.

Además, solo por mencionarlo, no existe nada como C/C++: existe C y existe C++; esos son idiomas diferentes (que de hecho comparten mucho, pero aún así).

+2

Un buen punto acerca de la información adicional en los encabezados; es posible que desee mencionar los parámetros predeterminados para las funciones miembro solo se pueden especificar en el encabezado, y la mayoría del código de la plantilla solo se almacena en los encabezados. – AshleysBrain

+0

@AshleysBrain: buenos ejemplos de hecho. Los agregué a mi respuesta. Gracias ! – ereOn

0

Considerando que ha declarado algunas funciones y ha escrito su implementación, tendrá un archivo .c/cpp y un archivo .h de encabezado.

Lo que debe hacer con el fin de utilizar esas funciones:

  1. Crear una biblioteca (DLL/o de manera estática biblioteca .a/lib - por ahora recomiendo biblioteca estática para la facilidad de uso) de los archivos fueron la implementación reside
  2. Utilice el archivo de encabezado (#include it) (no necesita para volver a escribir el archivo de encabezado) en sus programas para obtener las definiciones de función y enlace con su biblioteca desde el paso 1.

Aunque>this < es un ejemplo para Visual Studio también tiene sentido para otros entornos de desarrollo.

+3

En realidad, no es necesario crear una biblioteca. También puede simplemente vincular en el archivo objeto (solo para completarlo). –

+0

@ Space_C0wb0y Verdadero – INS

0

Esto parece como una pregunta rudimentaria, por lo que suponiendo que no tengo mis-Read, Aquí es un ejemplo básico de reutilización, para responder a su primera pregunta:

#include "stdio.h" 

int main(int c, char ** argv){ 
    puts("Hello world"); 
} 

Explicación: 1. stdio .h es un archivo de cabecera C que contiene (entre otros) la definición de una función llamada puts(). 2. en main, puts() se llama, a partir de la definición incluida.

Algunos compiladores (incluido gcc, creo) tienen la opción de generar encabezados.

0

Siempre hay verymuchconfusion sobre los encabezados y los archivos fuente en C++. Los enlaces que proporcioné deberían ayudar a aclarar eso un poco.

Si se encuentra en la situación de que desea extraer los encabezados del archivo fuente, entonces probablemente lo haya hecho de forma incorrecta. Por lo general, primero declaras tu función en un archivo de cabecera y luego le proporcionas una implementación (definición) en un archivo fuente. Si su función es realmente un método de una clase, también puede proporcionar la definición en el archivo de encabezado.

Técnicamente, un archivo de cabecera es sólo un montón de texto que realmente se inserta en el archivo de origen por el preprocesador:

#include <vector> 

le dice al preprocesador para insertar contenido del vector de archivo en el lugar exacto donde el #include aparece. Esto es solo un reemplazo de texto. Por lo tanto, los archivos de encabezado no son una especie de constructo de lenguaje especial. Ellos contienen un código normal. Pero al poner ese código en un archivo separado, puede incluirlo fácilmente en otros archivos utilizando el preprocesador.

+0

+1 Probablemente una de las mejores respuestas – nico

+0

-1 Es una explicación de cómo funcionan los archivos de encabezado/fuente, no una respuesta a la pregunta. –

+0

En mi opinión, la forma en que se hizo la pregunta revela que el OP no comprende la forma en que funcionan los encabezados. Si lo hiciera, él mismo podría responder su pregunta. Cualquier respuesta que resuelva su problema, pero no lo ayuda a entenderlo en primer lugar, realmente no está ayudando mucho. Creo que he proporcionado toda la información necesaria para que él mismo resuelva el problema. –

0

creo que es una buena pregunta que es lo que me llevó a preguntar esto: Visual studio: automatically update C++ cpp/header file when the other is changed?

Hay algunas herramientas de refactorización mencionados, pero por desgracia no creo que hay una solución perfecta; simplemente tiene que escribir sus firmas de funciones dos veces. La excepción es cuando estás escribiendo tus implementaciones en línea, pero hay razones por las que no puedes o no debes siempre hacer esto.

1

Me parece que realmente no necesita/desea generar encabezados automáticamente desde la fuente; desea poder escribir un único archivo y tener una herramienta que pueda dividirlo de manera inteligente en un archivo de cabecera y un archivo fuente.

Desafortunadamente, no conozco ninguna herramienta de este tipo. Ciertamente es posible escribir uno, pero necesitaría una interfaz de usuario de C++.Podría intentar escribir algo usando clang, pero sería una gran cantidad de trabajo.

0

Te puede interesar Lazy C++. Sin embargo, debe hacer algunos proyectos a la antigua (con encabezado y archivos fuente separados) antes de intentar usar esta herramienta. Consideré usarlo yo mismo, pero luego pensé que siempre estaría editando accidentalmente los archivos generados en lugar del archivo lzz.

0

Se podía poner todas las definiciones en el archivo de cabecera ...

Esto va en contra common practice, pero no es unheard of.

Cuestiones relacionadas