Considérons l'exemple suivant. Il se compose de deux fichiers d'en-tête, déclarant deux espaces de noms différents:Espaces de noms C++: utilisation croisée
// a1.h
#pragma once
#include "a2.h"
namespace a1
{
const int x = 10;
typedef a2::C B;
}
et le second est
// a2.h
#pragma once
#include "a1.h"
namespace a2 {
class C {
public:
int say() {
return a1::x;
}
};
}
Et un seul fichier source, main.cpp
:
#include <iostream>
#include "a1.h"
#include "a2.h"
int main()
{
a2::C c;
std::cout << c.say() << std::endl;
}
De cette façon, il doesn compilez pas (essayé GCC et MSVC). L'erreur est que les espaces de noms a1
ne sont pas déclarés (C2653 sous Windows). Si vous changez inclure ordre main.cpp
cette façon:
#include "a2.h"
#include "a1.h"
vous obtenez un message d'erreur symétrique, à savoir a2
espace de noms est pas déclaré.
Quel est le problème?
#pragma once est pas C++, il est une chose Microsoft. Meilleur remplacé par #ifdef A1_H #define A1_H ... #endif // A1_H – MSalters