significa que programacion programa otro incluir hacer encabezado definicion como cabecera archivos archivo c++ header guard

c++ - que - incluir un archivo c en otro



Protectores de encabezado en C++ (5)

En LearnCpp.com | 1.10 - Una primera mirada al preprocesador . Debajo de Guardias de encabezado , están esos fragmentos de código:

add.h:

#include "mymath.h" int add(int x, int y);

restar.h:

#include "mymath.h" int subtract(int x, int y);

main.cpp:

#include "add.h" #include "subtract.h"

Al implementar el protector de encabezado , se menciona de la siguiente manera:

#ifndef ADD_H #define ADD_H // your declarations here #endif

  • ¿Cuál podría ser la declaración aquí? Y, ¿debería int main() venir después de #endif ?
  • ¿ _H una convención o algo que se debe hacer?

Gracias.


Declaro una declaración en el archivo de encabezado y las definiciones o int main() viene en el archivo source.cpp .

_H está ahí simplemente para indicar que alguien va a incluir archivos de encabezado usando guardias de inclusión.

Si estás en MSVC ++ también puedes usar #pragma once


El FILENAME_H es una convención. Si realmente lo deseaba, podría usar #ifndef FLUFFY_KITTENS como protector de encabezado (siempre que no se haya definido en otro lugar), pero sería un error complicado si lo definiera en otro lugar, por ejemplo, el número de gatitos para una cosa u otra.

En el archivo de cabecera add.h, las declaraciones se encuentran literalmente entre #ifndef y #endif .

#ifndef ADD_H #define ADD_H #include "mymath.h" int add(int x, int y); #endif

Finalmente, int main() no debería estar en un archivo de encabezado. Siempre debe estar en un archivo .cpp .

Para aclararlo:

#ifndef ADD_H significa básicamente "si ADD_H no ha sido #defined en el archivo o en un archivo incluido, luego compila el código entre las directivas #ifndef y #endif ". Por lo tanto, si intenta #include "add.h" más de una vez en un archivo .cpp , el compilador verá qué ADD_H ya estaba #defined e ignorará el código entre #ifndef y #endif . Las protecciones de encabezado solo evitan que un archivo de encabezado se incluya varias veces en el mismo archivo .cpp . Los resguardos de encabezado no impiden que otros archivos .cpp incluyan el archivo de encabezado. Pero todos los archivos .cpp pueden incluir el archivo de encabezado protegido solo una vez .


No, el int main () va en un .cpp. Las declaraciones son las otras cosas que ibas a poner en el encabezado. _H es una convención, puede ver varias convenciones de guardias de encabezado.


Todo lo que hacen los guardias de encabezado es solo permitir que los encabezados se incluyan una vez. (Si se incluyen varias veces, se ignoran).

El nombre que use no importa, pero es convencional usar el nombre del archivo en mayúsculas, incluida la extensión que usted demostró.

Tu main debería estar realmente en un archivo .cpp , pero si lo estás poniendo en un encabezado, ponlo dentro de los guardias para que no se declare varias veces.


  • El resultado del preprocesamiento de un archivo de implementación (".cpp") es una unidad de traducción (TU).

  • Los encabezados pueden incluir otros encabezados, por lo que un encabezado se puede incluir indirectamente varias veces dentro de la misma TU. (Your mymath.h es un ejemplo de esto).

  • Las definiciones solo pueden ocurrir una vez por TU. (Algunas definiciones tampoco deben estar en múltiples TU; este caso es ligeramente diferente y no se trata aquí).

  • El problema es que la resolución de guardias previene errores de definición múltiple cuando un encabezado dado se incluye más de una vez dentro de una TU.

  • Incluya guardias que trabajen "envolviendo" el contenido del encabezado de tal manera que el segundo y subsiguientes incluyen no-operaciones. Las directivas # ifndef / # definen deben ser las dos primeras líneas del archivo, y #endif debería ser la última.

  • Incluir guardias solo se usan en los encabezados. No defina su función principal en un encabezado: póngalo en un archivo de implementación.

Si tiene un encabezado que definirá un tipo y declarará una función, pero también necesita un encabezado:

#include "other_header.h" struct Example {}; void f();

"Envolverlo" con guardias incluye los contenidos completos del archivo:

#ifndef UNIQUE_NAME_HERE #define UNIQUE_NAME_HERE #include "other_header.h" struct Example {}; void f(); #endif

El nombre utilizado para el protector de inclusión debe ser único, de lo contrario los nombres en conflicto darán resultados confusos. Estos nombres son solo macros simples, y no hay nada en el lenguaje que refuerce un cierto estilo. Sin embargo, las convenciones de proyecto generalmente imponen requisitos. Hay varios estilos diferentes de nombres de guardias que puede encontrar aquí en SO y en otros lugares; esta respuesta ofrece buenos criterios y una buena visión general.