¿Por qué la omisión de “#include ” solo ocasiona fallas de comstackción?

Soy un principiante con C ++. Cuando escribo el código algunas veces escribo #include y el código funciona, otras veces no escribo #include y el código no funciona. Pero a veces funciona sin #include .

Entonces, ¿tengo que escribir #include para que el código funcione?

Si usa miembros que están declarados dentro de la string encabezado estándar, entonces sí, debe incluir ese encabezado directa o indirectamente (a través de otros encabezados).

Algunos comstackdores de algunas plataformas pueden comstackr en algún momento del mes aunque no haya incluido el encabezado. Este comportamiento es desafortunado, no confiable y no significa que no deba incluir el encabezado.

La razón es simplemente que ha incluido otros encabezados estándar que también incluyen string . Pero como ya he dicho, en general no se puede confiar en esto y también puede cambiar de repente (cuando se instala una nueva versión del comstackdor, por ejemplo).

Siempre incluya todos los encabezados necesarios. Lamentablemente, no parece haber una documentación en línea confiable sobre qué encabezados deben incluirse. Consulte un libro, o el estándar oficial de C ++.

Por ejemplo, el siguiente código se comstack con mi comstackdor ( gcc 4.6):

 #include  int main() { std::string str; } 

Pero si elimino la primera línea, ya no comstack aunque el encabezado iostream realmente no esté relacionado.

Es posible que otros encabezados que incluya tengan #include en ellos.

Sin embargo, generalmente es una buena idea #include directamente en su código incluso si no es estrictamente necesario para una comstackción exitosa, en caso de que estos “otros” encabezados cambien, por ejemplo debido a un comstackdor diferente (o una versión diferente) / implementación de biblioteca estándar, plataforma o incluso solo una configuración de comstackción.

(Por supuesto, esta discusión se aplica a cualquier encabezado, no solo a ).

Aunque no hay una ocurrencia directa de #include en un archivo fuente particular, no significa que no haya sido incluido en otro archivo de encabezado. Considera esto:

Archivo: header.h

 #if !defined(__HEADER_H__) #define __HEADER_H__ // more here #include  // ...and here #endif 

Archivo: source1.cc

 #include  void foo() { // No error here. string s = "Foo"; } 

Archivo: source2.cc

 #include 
void bar() { // Still no error, since there's a #include in header.h string s = "Bar"; }

Archivo: source3.cc

 void zoid() { // Here's the error; no such thing as "string", since non of the // previous headers had been included. string s = "Zoid"; } 

Si solo está utilizando un puntero / referencia a un tipo definido por el usuario, solo se debe declarar el tipo:

 class my_class; void foo(const my_class& c); 

Pero cuando usa el valor, el comstackdor necesita saber el tamaño y con eso la definición del tipo.

Y tenga en cuenta que los encabezados estándar pueden incluir otros, lo que no significa automáticamente que todas las implementaciones lo hagan, por lo que no puede confiar en eso.

No es cierto que la cadena de encabezado esté incluida en otros encabezados. La cadena de encabezado solo tiene incluye. Sin Definiciones De modo que todas las definiciones necesarias para el uso de cadenas están en encabezados incluidos por la cadena de encabezado. Es posible que estos encabezados ya estén incluidos en otros encabezados. Entonces todo funciona. El encabezado ios, por ejemplo, incluye stringbuf, que incluye …