mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
134 lines
4.2 KiB
Plaintext
134 lines
4.2 KiB
Plaintext
This document present the STLport namespace schema and give additionnal
|
|
information about how STLport replace the native C++ Standard library
|
|
coming with your compiler.
|
|
|
|
1. What is the STLport namespace ?
|
|
|
|
As STLport is a C++ Standard library implementation the STLport namespace
|
|
is 'std'. In normal use this is all you need to know and you can stop reading
|
|
here.
|
|
|
|
2. How does STLport replace native C++ Standard library ?
|
|
|
|
STLport defines a macro 'std' that replaces all references of std in the
|
|
user code by a different name. This technique has has some drawback but also
|
|
advantages. The drawback is that you cannot declared Standard component like
|
|
that:
|
|
|
|
|
|
//foo.h
|
|
namespace std
|
|
{
|
|
template <class _Tp>
|
|
class allocator;
|
|
}
|
|
|
|
void f1(const std::allocator<int>&);
|
|
|
|
|
|
//foo.cpp
|
|
#include "foo.h"
|
|
#include <memory>
|
|
|
|
void f1(const std::allocator<int>& alloc)
|
|
{
|
|
//implementation
|
|
}
|
|
|
|
//bar.cpp
|
|
#include "foo.h"
|
|
#include <memory>
|
|
|
|
int main(int, char**)
|
|
{
|
|
std::allocator<int> alloc;
|
|
f1(alloc);
|
|
}
|
|
|
|
If you build this code you will surely have a compilation error as f1 is declared
|
|
as taking a std::allocator parameter but you are calling it using an STLport allocator
|
|
instance that is not in the std namespace. The good news is that this drawback is easy
|
|
to detect as it will generate compilation error or at least link time error. The only
|
|
workaround is to include an arbitrary Standard header before the allocator declaration.
|
|
Good candidates for that are <utility> or <cerrno> as they are small headers. Including
|
|
those headers will replace std with the STLport namespace.
|
|
|
|
The advantage of this macro replacement is that we can customize the STLport namespace
|
|
depending on the compilation options. For instance the STLport safe mode you can use by
|
|
defining _STLP_DEBUG is not binary compatible with a normal debug build. To ensure that
|
|
no one will ever build code without _STLP_DEBUG and link with STLport library built with
|
|
this option the namespace is different so that it will generate link time error rather
|
|
than random crashes during application execution.
|
|
|
|
3. Why not having use namespace injection ?
|
|
|
|
An other way to replace native Standard C++ library implementation would have been to
|
|
use namespace injection:
|
|
|
|
namespace std
|
|
{
|
|
using namespace stlport;
|
|
}
|
|
|
|
This solution has a first major drawback which is that STLport would be much more sensible
|
|
to native headers. If you include a C++ native headers that indirectly define for instance
|
|
the vector class it is going to conflict with the STLport vector definition.
|
|
|
|
Moreover this solution just does not work for a very simple reason. The C++ Standard
|
|
allows users to specialized some of the Standard algorithms. This specialization has to
|
|
be done in the same namespace as the main template declaration:
|
|
|
|
//In an STLport header:
|
|
namespace stlport
|
|
{
|
|
template <class _Tp>
|
|
struct less
|
|
{
|
|
bool operator () (const _Tp& x, const _Tp& y) const;
|
|
};
|
|
}
|
|
|
|
//User code:
|
|
|
|
struct MyStruct;
|
|
|
|
namespace std
|
|
{
|
|
template <>
|
|
struct less<MyStruct>
|
|
{
|
|
};
|
|
}
|
|
|
|
As you can see the specialization is not in the STLport less namespace and it
|
|
won't be used in associative containers for instance.
|
|
|
|
4. What is the STLport specific namespace ?
|
|
|
|
The official STLport namespace is: stlport. Once again this is not the real namespace
|
|
where all the Standard stuff are. As the real STLport namespace change depending on compilation
|
|
options you cannot use it directly. So stlport is an alias of the real STLport namespace.
|
|
|
|
5. What are the other STLport namespaces ?
|
|
|
|
Those names are given for information purpose and should never be used in any user code. The
|
|
default STLport namespace is: stlp_std. Here is the list of the customized namespaces:
|
|
|
|
- stlpd_std : when _STLP_DEBUG is defined
|
|
- stlpx_std : when you use STLport as a shared library linked to the static version of the native
|
|
runtime or when you build the static STLport library linked with the dynamic version. This option
|
|
is only supported by a limited number of compilers.
|
|
- stlpmtx_std : when building STLport as not thread safe.
|
|
|
|
You can also have combination of those extension like stlpdxmtx_std or stlpdmtx_std...
|
|
|
|
There is also an other STLport namespace for STLport internal functions or struct/class: priv.
|
|
|
|
namespace stlport
|
|
{
|
|
namespace priv
|
|
{
|
|
}
|
|
}
|
|
|