48 votes

Pourquoi l'omission de "#include<string> " ne provoque que parfois des échecs de compilation ?

Je suis débutant en C++. Quand j'écris le code parfois j'écris #include <string> et le code fonctionne, d'autres fois je n'écris pas #include <string> et le code ne fonctionne pas. Mais parfois, cela fonctionne sans #include <string> .

Dois-je donc écrire #include <string> pour que le code fonctionne ?

3voto

Linus Kleen Points 15925

Bien qu'il n'y ait pas d' occurrence #include <string> dans un fichier source particulier, cela ne signifie pas qu'il n'a pas été inclus par un autre fichier d'en-tête. Considère ceci:

Fichier : header.h

 #if !defined(__HEADER_H__)
#define __HEADER_H__

// more here
#include <string>
// ...and here

#endif

Fichier : source1.cc

 #include <string>

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

Fichier : source2.cc

 #include <header.h>

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

Fichier : 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";
}

0voto

cooky451 Points 1415

Si vous utilisez simplement un pointeur/référence à un type défini par l'utilisateur, le type doit uniquement être déclaré :

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

Mais lorsque vous utilisez la valeur, le compilateur doit connaître la taille et avec cela la définition du type.

Et gardez à l'esprit que les en-têtes standard peuvent en inclure d'autres, ce qui ne signifie pas automatiquement que toutes les implémentations le font, vous ne pouvez donc pas vous y fier.

0voto

F. Kaspar Points 1

Il n'est pas vrai que la chaîne d'en-tête est incluse par d'autres en-têtes. La chaîne d'en-tête elle-même n'a que des inclusions. Pas de définitions. Ainsi, toutes les définitions nécessaires à l'utilisation de la chaîne se trouvent dans les en-têtes inclus par la chaîne d'en-tête. Ces en-têtes peuvent déjà être inclus par d'autres en-têtes. Ensuite, tout fonctionne. L'en-tête ios par exemple inclut stringbuf, qui inclut ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X