Menú
Está libre
registrarse
el principal  /  POR / Archivo de origen C. En línea, incluido un archivo fuente c en otro? ¿Qué puede estar en el archivo de encabezado?

Archivo de origen C. En línea, incluido un archivo fuente c en otro? ¿Qué puede estar en el archivo de encabezado?

Archivos fuente

El texto del programa SI se puede dividir en varios archivos de origen. El archivo de origen es un archivo de texto que contiene todo el programa o parte de ella. Al compilar el programa de origen, cada uno de los componentes de sus archivos de origen debe recopilarse por separado y luego asociado con otros archivos por el enlazador. Los archivos de origen separados se pueden combinar en un archivo de origen, compilados como un entero único, a través de la directiva del preprocesador #Incluir..

El archivo de origen puede contener cualquier combinación holística de directivas, indicando el compilador, los anuncios y las definiciones. En virtud de la integridad, se entiende que tales objetos como definiciones de funciones, estructuras de datos o un conjunto de directivas de compilación convencionales deben estar ubicadas completamente en un archivo, es decir, no pueden comenzar en un archivo, pero continúe en el otro.

El archivo de origen no tiene que contener a los operadores ejecutados. A veces, es conveniente colocar definiciones variables en un archivo, y en otros archivos para usar estas variables por AD. En este caso, las definiciones de variables sean fácilmente accesibles para buscar y modificar. De las mismas consideraciones, generalmente se recopilan las constantes nombradas y las definiciones de macro en archivos separados e incluyenlos a través de una directiva de preprocesador. #Incluir. En aquellos archivos de origen en los que se requieren.

Nota El compilador generalmente se aplica solo para secciones individuales del archivo de origen. Las acciones específicas del compilador especificado por las instrucciones están determinadas por la implementación específica del compilador de idioma SI.

En el siguiente ejemplo, el programa de origen consta de dos archivos de origen. Funciones principal. y max Presentado en archivos separados. Función principal. usa la función max En el proceso de su ejecución.

/ * Archivo de origen 1 - principal * /

externo int max (int, int); / * Función de función * /

definición principal () / * Función * /

int w \u003d uno, x \u003d dos, y \u003d tres;

/ * Archivo de origen 2 - MAX * /

iNT MAX (A, B) / * Definición de función * /

En la primera función de archivo de origen. max Declarado, pero no definido. Dicha función de anuncio se llama preliminar; Permite al compilador controlar la apelación a la función antes de que se define. Definición de función principal. Contiene llamadas de función max.

Las filas que comienzan con el símbolo # son las directivas del preprocesador. Las directivas indican el preprocesador sobre la necesidad de reemplazar en el primer archivo fuente de uno, dos, tres identificadores a los valores correspondientes. El área de la Directiva no se aplica al segundo archivo de origen.



Dependiendo de su entorno de ensamblaje (no especifique), puede detectar que funciona exactamente como quiera.

Sin embargo, hay muchos ambientes (tanto IDE como muchos maquinícizos manualmente maquinados), que están a la espera de la compilación * .c: si esto sucede, es probable que se encuentre con los errores del enlazador debido a la duplicación de caracteres.

Como regla general, esta práctica debe ser evitada.

Si tiene que necesitar encender la fuente (y, por lo general, debe evitarse), use otro archivo para el archivo.

Habilitar el archivo C en otro archivo es legal, pero no apropiado si definitivamente no sabe por qué lo hace y lo que está tratando de lograr.
Estoy casi seguro de que si publica una razón aquí, según la cual se comunicará su pregunta a la comunidad, encontrará otra forma adecuada de lograr su objetivo (prestar atención a "casi", ya que es posible que esta decisión, Dado el contexto).

Por cierto, me perdí la segunda parte de la pregunta. Si el archivo C está habilitado en otro archivo y, al mismo tiempo, se incluye en el proyecto, probablemente se encontrará con el problema de los caracteres de duplicación, por qué la unión de objetos, es decir, la misma función se definirá dos veces (si solo no son estática ).

El idioma C no prohíbe este tipo de #include, pero la unidad de traducción resultante aún debe ser válida C.

No sé qué programa usa el archivo S.PRJ. Si usa algo como "Hacer" o Visual Studio o otra cosa, solo asegúrese de que instale su lista de archivos que deben compilarse sin que no se puedan compilar de forma independiente.

Puede usar el compilador GCC en Linux para enlazar dos archivos con una salida. Supongamos que tiene dos archivos C, uno de los cuales es "main.c", y el otro es "support.c". Por lo tanto, el comando para conectar estos dos

Gcc main.c support.c -o main.out

Estos dos archivos se asociarán con una salida principal. Para iniciar el comando de salida será

./cabo principal.

Si usa la función principal.c, que se declara en el archivo support.c, entonces debe declararlo principalmente también utilizando la clase de almacenamiento externa.

Se usa correctamente, puede ser un método útil.

Supongamos que tiene un subsistema crítico complicado con una interfaz pública bastante pequeña y un gran código de implementación no realizado. El código funciona hasta varias mil filas, cientos de funciones privadas y un poco de datos privados. Si trabaja con sistemas incorporados no triviales, es probable que a menudo se enfrentan a esta situación.

Es probable que su decisión sea multinivel, modular y desatada, y estos aspectos pueden representarse y reforzarse convenientemente al codificar varias partes del subsistema en diferentes archivos.

Con C, puedes perder mucho al hacerlo. Casi todas las herramientas proporcionan una optimización decente para una unidad de compilación única, pero se refieren de manera muy pesimista a algo declarado Externo.

Si pones todo en un módulo de origen C, obtendrás -

    Mejora de la productividad y el código de tamaño: en muchos casos, se construirán las llamadas de la función. Incluso sin incrustaciones, el compilador tiene oportunidades para crear un código más eficiente.

    Los datos y las funciones de nivel de canal están ocultos.

    Evitando la contaminación del espacio de nombres y su consecuencia: puede usar nombres menos voluminosos.

    Compilación y comunicación más rápidas.

Pero también obtienes un desastre malvado cuando se trata de editar este archivo, y pierdes la modularidad implícita. Esto se puede superar dividiendo el código fuente en varios archivos y convirtiéndolos en una sola unidad de compilación.

Sin embargo, debe imponer algunos acuerdos para hacer frente a esto. Hasta cierto punto, dependerá de su cadena instrumental, pero algunos punteros generales.

    Coloque la interfaz abierta en un archivo de encabezado separado, todavía tiene que hacerlo.

    Tener un archivo principal.c, que incluye todos los archivos infantiles. También puede incluir el código para la interfaz abierta.

    Use los manifestantes del compilador para que los titulares privados y los módulos de origen no estén incluidos con los módulos de compilación externa.

    Todos los datos y funciones personales deben ser declarados estáticos.

    Mantenga una diferencia conceptual entre cada.h.h archivos. Utiliza acuerdos existentes. La diferencia es que tendrá muchos anuncios estáticos en sus titulares.

    Si su cadena de herramientas no impone ninguna base, no debe especificar los archivos de implementación privados como .c i.h. Si está utilizando guardias habilitadas, no generará código y no ingresará nombres nuevos (como resultado, puede encontrar algunos segmentos vacíos). Una gran ventaja es que otras herramientas (por ejemplo, IDE) procesarán estos archivos en consecuencia.

La extensión del archivo no importa para la mayoría de los compiladores C, por lo que funcionará.

Sin embargo, dependiendo de la configuración de su archivo o proyecto, el archivo C incluido puede generar un archivo de objeto separado. Cuando está vinculante, esto puede llevar a dobles caracteres.

debes agregar un título similar a esto.

#Incluir.

nota: Ambos archivos deben colocarse en un solo lugar.

Puede habilitar correctamente los archivos.c or.cpp en otros archivos de origen. Dependiendo de su entorno IDE, generalmente puede evitar la unión dual al ver las propiedades de los archivos de origen que desea habilitar, generalmente haciendo clic con el botón derecho en ellos y haga clic en las propiedades, y desmarque la compilación de la casilla / verificación / enlace / excluir de la Montaje o cualquier otra opción. tal vez. O no puede habilitar el archivo en el propio proyecto, por lo que el entorno IDE ni siquiera sabe que existe, y no intentará compilarlo. Y con Make-Files, simplemente simplemente no puso el archivo en él para la compilación y el diseño.

Editar: Lo sentimos, di una respuesta en lugar de una respuesta a otras respuestas :(



vOTE ONLINE (8)

Habilitar el archivo C en otro archivo es legal, pero no apropiado si definitivamente no sabe por qué lo hace y lo que está tratando de lograr.
Estoy casi seguro de que si publica una razón aquí, según la cual se comunicará su pregunta a la comunidad, encontrará otra forma adecuada de lograr su objetivo (prestar atención a "casi", ya que es posible que esta decisión, Dado el contexto).

Por cierto, me perdí la segunda parte de la pregunta. Si el archivo C está habilitado en otro archivo y, al mismo tiempo, se incluye en el proyecto, probablemente se encontrará con el problema de los caracteres de duplicación, por qué la unión de objetos, es decir, la misma función se definirá dos veces (si solo no son estática ).

La extensión del archivo no importa para la mayoría de los compiladores C, por lo que funcionará.

Sin embargo, dependiendo de la configuración de su archivo o proyecto, el archivo C incluido puede generar un archivo de objeto separado. Cuando está vinculante, esto puede llevar a dobles caracteres.

Dependiendo de su entorno de ensamblaje (no especifique), puede detectar que funciona exactamente como quiera.

Sin embargo, hay muchos ambientes (tanto IDE como muchos maquinícizos manualmente maquinados), que están a la espera de la compilación * .c: si esto sucede, es probable que se encuentre con los errores del enlazador debido a la duplicación de caracteres.

Como regla general, esta práctica debe ser evitada.

Si tiene que necesitar encender la fuente (y, por lo general, debe evitarse), use otro archivo para el archivo.

Puede usar el compilador GCC en Linux para enlazar dos archivos con una salida. Supongamos que tiene dos archivos C, uno de los cuales es "main.c", y el otro es "support.c". Por lo tanto, el comando para conectar estos dos

Gcc main.c support.c -o main.out

Estos dos archivos se asociarán con una salida principal. Para iniciar el comando de salida será

./cabo principal.

Si usa la función principal.c, que se declara en el archivo support.c, entonces debe declararlo principalmente también utilizando la clase de almacenamiento externa.

Pensé que compartiría la situación cuando mi equipo decidiera habilitar los archivos. Nuestro arquitecto consiste principalmente en módulos que se desatan a través del sistema de mensajes. Estos manipuladores de mensajes están disponibles públicamente y hacen que muchas funciones de operación estáticas locales realicen su trabajo. El problema surgió cuando estaba tratando de obtener un revestimiento para nuestros casos de prueba únicos, ya que la única forma de implementar este código de implementación en particular fue indirectamente a través de la interfaz de mensajes generales. Con algunas características del trabajador en las rodillas en la pila, resultó ser una pesadilla para asegurar un recubrimiento adecuado.

Habilitar archivos.c nos dio la oportunidad de llegar al tornillo en el automóvil, nos interesó las pruebas.

El idioma C no prohíbe este tipo de #include, pero la unidad de traducción resultante aún debe ser válida C.

No sé qué programa usa el archivo S.PRJ. Si usa algo como "Hacer" o Visual Studio o otra cosa, solo asegúrese de que instale su lista de archivos que deben compilarse sin que no se puedan compilar de forma independiente.

Se usa correctamente, puede ser un método útil.

Supongamos que tiene un subsistema crítico complicado con una interfaz pública bastante pequeña y un gran código de implementación no realizado. El código funciona hasta varias mil filas, cientos de funciones privadas y un poco de datos privados. Si trabaja con sistemas incorporados no triviales, es probable que a menudo se enfrentan a esta situación.

Es probable que su decisión sea multinivel, modular y desatada, y estos aspectos pueden representarse y reforzarse convenientemente al codificar varias partes del subsistema en diferentes archivos.

Con C, puedes perder mucho al hacerlo. Casi todas las herramientas proporcionan una optimización decente para una unidad de compilación única, pero se refieren de manera muy pesimista a algo declarado Externo.

Si pones todo en un módulo de origen C, obtendrás -

    Mejora de la productividad y el código de tamaño: en muchos casos, se construirán las llamadas de la función. Incluso sin incrustaciones, el compilador tiene oportunidades para crear un código más eficiente.

    Los datos y las funciones de nivel de canal están ocultos.

    Evitando la contaminación del espacio de nombres y su consecuencia: puede usar nombres menos voluminosos.

    Compilación y comunicación más rápidas.

Pero también obtienes un desastre malvado cuando se trata de editar este archivo, y pierdes la modularidad implícita. Esto se puede superar dividiendo el código fuente en varios archivos y convirtiéndolos en una sola unidad de compilación.

Sin embargo, debe imponer algunos acuerdos para hacer frente a esto. Hasta cierto punto, dependerá de su cadena instrumental, pero algunos punteros generales.

    Coloque la interfaz abierta en un archivo de encabezado separado, todavía tiene que hacerlo.

    Tener un archivo principal.c, que incluye todos los archivos infantiles. También puede incluir el código para la interfaz abierta.

    Use los manifestantes del compilador para que los titulares privados y los módulos de origen no estén incluidos con los módulos de compilación externa.

    Todos los datos y funciones personales deben ser declarados estáticos.

    Mantenga una diferencia conceptual entre cada.h.h archivos. Utiliza acuerdos existentes. La diferencia es que tendrá muchos anuncios estáticos en sus titulares.

    Si su cadena de herramientas no impone ninguna base, no debe especificar los archivos de implementación privados como .c i.h. Si está utilizando guardias habilitadas, no generará código y no ingresará nombres nuevos (como resultado, puede encontrar algunos segmentos vacíos). Una gran ventaja es que otras herramientas (por ejemplo, IDE) procesarán estos archivos en consecuencia.

¿Esto es normal? Sí, compilará

¿Se recomienda? Los archivos NO - .C se compilan en archivos.obj que están conectados después de la compilación (enlazador) en el archivo ejecutable (o biblioteca), por lo que no es necesario incluir un archivo.c a otro. En su lugar, lo más probable es que desee hacer un archivo.h, que enumera las funciones / variables disponibles en otro archivo.c y habilite File.h

Este tipo de pregunta, recientemente le pregunté a un colega, comenzando a programar en SI. Y pensé que era una buena razón para compartir mi comprensión de este problema. Porque incluso los programadores experimentados no siempre tienen puntos de vista similares sobre esto.

En parte, esta es una cuestión de gusto, así que está interesada como yo, bienvenido a CAT.

A pesar del hecho de que "toda la verdad" sobre los archivos H está contenida en la sección correspondiente de la descripción del preprocesador de GCC, se permite algunas explicaciones e ilustraciones.

Por lo tanto, si es literalmente, el archivo de encabezado (archivo H) es un archivo que contiene una declaración de Declaración y Macro destinada para su uso en varios archivos de origen (C-Archivos). Lo ilustramos.

Es fácil notar que las funciones 1 y 2, así como la macro 2, se mencionan en ambos archivos. Y debido a que, la inclusión de los archivos de encabezado conduce a los mismos resultados que copiamos los contenidos a cada archivo SI, podemos hacer lo siguiente:

De esta manera, simplemente asignamos una parte común de dos archivos y lo colocamos en el archivo de encabezado.
¿Pero es el archivo de encabezado con la interfaz en este caso?

  • Si necesitamos usar la funcionalidad que las funciones 1 y 2 se implementan en otro lugar, entonces sí
  • Si la macro 2 está diseñada solo para su uso en los archivos UNIT1.C y UNIT2.C, entonces no se coloca en el archivo de interfaz
Además, ¿realmente necesitamos tener dos archivos SI para implementar la interfaz definida en el archivo de encabezado? O es uno?
La respuesta a esta pregunta depende de los detalles de la implementación de las funciones de la interfaz y de su sitio de implementación. Por ejemplo, si hace que los diagramas se detallan más detallados, puede enviar una opción cuando las funciones de la interfaz se implementen en diferentes archivos:


Esta realización conduce a códigos altos, pruebas bajas y la complejidad de la reutilización de tales módulos.
Para no tener tales dificultades, siempre considero un archivo C y un archivo de encabezado como un módulo. En el cual,
  • el archivo de encabezado contiene solo aquellas declaraciones de funciones, tipos, macros que forman parte de la interfaz de este módulo.
  • El archivo C, a su vez, debe contener la implementación de todas las funciones declaradas en el archivo H, así como tipos privados, macros y funciones que se necesitan para implementar la interfaz.
Por lo tanto, si tuviera la oportunidad de implementar el código de que se aplicó el diagrama anterior, intentaría lograr lo siguiente (final de _c y _h en los nombres de archivos agregados debido a la imposibilidad de usar el punto en la herramienta que solía para crear diagramas):


El diagrama muestra que, de hecho, estamos tratando con dos módulos independientes, cada uno de los cuales tiene su propia interfaz en forma de un archivo de encabezado. Esto hace posible usar solo esa interfaz que es realmente necesaria en este caso en particular. Además, estos módulos se pueden probar independientemente entre sí.
El lector, probablemente, notó que la macro 2 del archivo de encabezado volvió de nuevo como una copia en ambos archivos SI. Por supuesto, no es muy conveniente apoyar. Pero también para hacer que esta parte macro de la interfaz no sea correcta.
En tales casos, prefiero hacer un archivo de encabezado separado que contiene tipos y macros necesarios por varios archivos SI.

Espero que logremos identificar a aquellas entidades que deben colocarse en archivos de encabezado. Además, muestre la diferencia entre las interfaces y los archivos que contienen declaraciones y macros necesarios por varios archivos SI.

Gracias por su atención al material.

support.Microsoft.

Al cambiar los archivos de origen en Visual C ++ y guardarlos, las cadenas deben completar los caracteres "CR / LF" [el símbolo de retorno del carro, la traducción de filas] combinación. En los sistemas UNIX, las cadenas se completan utilizando "LF". Por lo tanto, al ver los archivos que se han cambiado en el grupo Windows en los sistemas UNIX, los caracteres establecidos "^ M" pueden aparecer en las líneas. Esto sucede solo cuando el uso del editor no sabe cómo interpretar el archivo de Windows. Visual C ++ Puede abrir archivos, en cadenas que terminan con la creación de UNIX LF. Si cambia este archivo y lo guarda de Visual C ++, y luego se guarda en formato Windows (verá CR / LF y NO LF, que anteriormente estaba en el sistema).

Este artículo describe los procedimientos para guardar el archivo modificado creado en la plataforma Windows en un formato que se puede utilizar en los sistemas UNIX.

NOTA: Visual C ++. Net IDE contiene funciones disponibles para guardar el archivo en formato UNIX. En un entorno de desarrollo integrado, guarde el archivo usando Guardar como..., seleccione Guardar en la lista desplegable Guardar con codificación ...y haz click en el botón thrn . Seleccione de la lista desplegable la fila que codifica UNIX (LF)y luego haga clic OK.

Puede usar los siguientes pasos para crear un proyecto de aplicación de consola Win32 que convierte un archivo que contiene "CR / LF" para completar la cadena para "LF":

  1. Para crear un nuevo proyecto vacío WIN32 con el nombre DOS2UNIX usando las aplicaciones de la consola WIN32.
  2. De Archivo MENÚ, HAGA CLIC Nuevoy luego haga clic Archivos Pestaña.
  3. Escoger Archivo de origen C / C ++ E ingrese el nombre del nuevo archivo DOS2UNIX.CPP.
  4. Inserte el siguiente código en DOS2UNIX.CPP:

    #Incluir. #Incluir. #Incluir. Usando el espacio de nombres STD; INT principal (INT ARST, CHAR * ARGV) (¡SI (ARGC! \u003d 2) (COUT<< "Please specify: dos2unix filename" << endl; return 0; } char ch; char temp="\0"; //Open the file for reading in binarymode. ifstream fp_read(argv, ios_base::in \ / ios_base::binary); sprintf(temp, "%s.temp", argv); //Create a temporary file for writing in the binary mode. This //file will be created in the same directory as the input file. ofstream fp_write(temp, ios_base::out \ / ios_base::trunc \ / ios_base::binary); while(fp_read.eof() != true) { fp_read.get(ch); //Check for CR (carriage return) if((int)ch == 0x0D) continue; if (!fp_read.eof())fp_write.put(ch); } fp_read.close(); fp_write.close(); //Delete the existing input file. remove(argv); //Rename the temporary file to the input file. rename(temp, argv); //Delete the temporary file. remove(temp); return 0; }

  5. De Edificio MENÚ, HAGA CLIC Creando dos2unix.exe. Para crear un archivo exe.

Puede ser necesario verificar este archivo EXE para ver si funciona correctamente. Para hacer esto, abra el archivo en el editor binario de Visual C ++ al seleccionar Abierto en un grupo Archivo Menú seleccionando dos2unix.ex, configuración Abierto como Kom Binarioy luego haciendo clic Abierto. Por ejemplo, si el archivo contiene "HelloclfWorld", los datos del archivo binario (hexadecimal) se verán así:

48 65 6 C 6 C 6F 0 D 0A 57 6F 72 6 C 64

Esto es equivalente a:

Hola
Paz

En el símbolo del sistema, ejecute el comando dos2unix.exe . A continuación, abra el archivo en el editor binario de Visual C ++. Verás que se elimina 0x0d S. Hasta que cambie el archivo y lo guarde en Visual C ++ 0x0d s no aparecerá.

Esto se puede utilizar en combinación con el modelo de automatización Visual C ++ Automatice el proceso completo. Se puede escribir un simple escenario macro de Microsoft Visual Visual Basic para llamar a este fondo, pero primero debe agregar Servicio El menú es el siguiente:

  1. De Servicio MENÚ, HAGA CLIC Configuracióny luego haga clic Servicio Pestaña.
  2. Especifique el nombre, como DOS2UNIX, y especifique la ruta completa al archivo DOS2UNIX.EXE en Equipo Campo de edición.
  3. Establecer para argumento, $ (nombre de archivo) $ (FileExt).
  4. Especifique el directorio de origen de $ (wkspdir) (especifique su propio camino).

Para verificar el programa, abra el archivo en Visual C ++ Editor, y luego desde Servicio Menú de lanzamiento Dos2unix medio. Verá que todos sus personajes de CR fueron eliminados en el editor.

Si necesita automatizar este proceso para procesar de tal manera que cada vez que guarde el archivo abierto en el Editor de Visual C ++, la herramienta DOS2UNIX.EXE se llama para eliminar 0x0d S, y luego usar la siguiente macro vbscript:

"Este documento se enciende cada vez que se guarda el documento en el editor VC ++. Sub application_documentosave (thedocument)" Esto llamará a la herramienta de usuario en el menú Herramientas. "Cambie el número dependiendo de lo que tiene. De forma predeterminada, solo usted" tiene 6 herramientas en el menú Herramientas, por lo que la herramienta DOS2UNIX será el séptimo. Ejecutecomand "usertool7" final sub

Este código vbscript funcionará solo si tiene archivos abiertos al editor de Visual C ++. Esta es la única forma de llamar a un archivo EXE desde una macro VBScript (la macro VBScript no se puede transferir a los parámetros). Puedes escribir en su lugar y será más flexible. Llame a la herramienta "dos2unix.exe" desde el complemento sin tener que agregarlo a Servicio menú.

En Visual C ++ utilizando las macros proporcionadas por VBScript:

  1. Abra un archivo existente con extension.dsm o cree uno.
  2. Inserte el código que se muestra previamente en el archivo.
  3. En Visual C ++, siga estos pasos.
    1. De Servicio MENÚ, HAGA CLIC Configuración.
    2. presiona el botón Archivos macros y complementos Pestaña.
    3. presiona el botón Descripción general Descargar archivo.dsm que contiene macro. Una vez en el archivo.dsm fue elegido en Descripción generalcuadro de diálogo, el archivo aparecerá en Suplementos y Macros Lista de archivos utilizando la casilla de verificación seleccionada junto a ella.
    4. presiona el botón Cerca continuar.

Ahora, si abre el archivo en el editor de Visual C ++ y ahorra del archivo Archivo El menú llamado Macro y todos los 0x0d S se eliminarán desde el archivo abierto. A medida que afecta a cualquier archivo, ahorre de ahora en adelante y solicite cualquier proyecto para abrirlo en el futuro, asegúrese de apagar la macro de Servicio Menú con ayuda Configuración (Desmarque la casilla de verificación junto a la macro).