tipos librerias libreria lenguaje funciones dev descargar definicion clases c++ include header-files standard-library precompiled-headers

librerias - C++ ¿Debo incluir bibliotecas estándar para cada archivo fuente?



librerias de dev c++ (4)

Estoy un poco confundido en este momento porque planeo incluir múltiples archivos de origen y encabezado por primera vez en uno de mis proyectos.
Entonces, me pregunto si este sería el enfoque correcto.
¿Debo incluir el encabezado de cadena en cada archivo fuente que lo usa directamente?
¿Y el encabezado "stdafx.hpp" que Visual C ++ quiere que incluya?

¿Ese sería el camino a seguir?

main.cpp

#include "stdafx.hpp" #include <string> //? #include <stringLib1.h> #include <stringLib2.h> using std::string; //use a windows.h function here //use a stringLib1 function here //use a stringLib2 function here

stringLib1.h

#include "stdafx.hpp" #include <string> using std::string; class uselessClass1 { public: string GetStringBack1(string myString); };

stringLib1.cpp

#include "stdafx.hpp" string uselessClass1::GetStringBack1(string myString) { return myString; }

stringLib2.h

#include "stdafx.hpp" #include <string> using std::string; class uselessClass2 { public: string GetStringBack2(string myString); };

stringLib2.cpp

#include "stdafx.hpp" string uselessClass2::GetStringBack2(string myString) { return myString; }


El stdafx include debe estar en la parte superior de cada archivo .cpp y NO debe estar en archivos .h. Puede poner #include <cadena> en stdafx.h si no desea ponerlo en cualquier otro archivo.


Supongo que también debe tener sus propios archivos de encabezado que pueden requerir en otros archivos cpp y archivos de encabezado. Como el que diste

#include <stringLib1.h> #include <stringLib2.h>

En mi opinión, es mejor crear un archivo de encabezado común en el que incluya todos los archivos de encabezado de biblioteca común y el archivo de encabezado de proyecto. Este archivo puede incluir en todos los otros archivos cpp y archivos de encabezado. Y será mejor usar protectores de cabecera también.

Por lo tanto, teniendo en cuenta un archivo de encabezado común "includes.h".

#ifndef INCLUDES_H #define INCLUDES_H #include <string> #include <stringLib1.h> #include <stringLib2.h> /***Header files***/ #endif //INCLUDES_H

Este es ahora su archivo de encabezado común. Esto puede incluirlo en todos sus archivos de proyecto.


  1. Una buena práctica es generalmente incluir solo lo que su código usa en cada archivo. Eso reduce las dependencias de otros encabezados y, en proyectos grandes, reduce los tiempos de compilación (y también ayuda a descubrir qué depende de qué)

  2. Utilice incluir guardias en sus archivos de encabezado

  3. No importe todo al contaminar el espacio de nombre global, por ej.

    using namespace std;

    pero más bien califica lo que piensas usar cuando lo necesites

  4. No necesita stdafx.h en su proyecto a menos que esté usando encabezados precompilados . Puede controlar este comportamiento en las propiedades del proyecto VS ( C / C ++ -> Encabezados precompilados -> Encabezado precompilado )


El encabezado stdafx.h es necesario si el encabezado precompilado está habilitado en VS. ( Lea esto ) Solo necesita incluir stdafx.h en sus archivos .cpp como primer include.

En cuanto a los archivos header y cpp (que vienen en pares), incluya los elementos necesarios para la declaración en el encabezado e incluya todo lo demás (necesario para la definición) en cpp. También incluya el encabezado correspondiente en su par cpp también. Y el uso incluye guardias .

myclass.h

#ifndef MYCLASS_H // This is the include guard macro #define MYCLASS_H #include <string> using namespace std; class MyClass { private: string myString; public: MyClass(string s) {myString = s;} string getString(void) {return myString;} void generate(); }

myclass.cpp

#include <stdafx.h> // VS: Precompiled Header // Include the header pair #include "myclass.h" // With this one <string> gets included too // Other stuff used internally #include <vector> #include <iostream> void MyClass::generate() { vector<string> myRandomStrings; ... cout << "Done/n"; } #endif

Luego, en main(...) , puede simplemente incluir myclass.h y llamar a la función generate() .