Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2006-09-29 05:14:04

Joaquín Mª López Muñoz <joaquin_at_[hidden]> writes:

>> > libs/thread/src/mutex.inl:
>> > *U* unnamed namespace at line 7
>> > libs/thread/src/timeconv.inl:
>> > *U* unnamed namespace at line 7
>> > libs/thread/test/util.inl:
>> > *U* unnamed namespace at line 19
>> I foolowed the link
>> and then "guidline violations"
>> but was not able to find the guidelines about "usage of unnamed
>> namespaces in headers". Also the suspect files are neither *.hpp nor *.ipp.

Another guideline that we don't check for, and maybe we never wrote down:
all files containing C++ source code should have a 3-letter extension
ending in "pp". This decision dates back to the earliest days of
Boost, when Nico Josuttis was still a heavy player here (it was his
idea, and a good one -- it makes searching through C++ source files
much easier).

So please, no ".inl" files. If you really must use a separate file
for inline implementation, use ".ipp"

> As for the latter, the problem with unnamed spaces in headers is that they
> can lead to ODR violations, see for instance:
>> Can you please give me a hint, how I should correct this?
> If you think your usage of unnamed spaces is actually correct, then
> simply have your file contain the following (possibly inside a comment):
> boostinspect:nounnamed
> to instruct the inspect tool to skip.

Yeah, but be really careful, because there are only a few good ways
to use an unnamed namespace in a header. In fact, the only legitimate
way to fix the Boost.Bind placeholder issue for header-only libs,
without ODR or order-of-initialization issues, is:

    // placeholders.hpp
    template <class SomePOD>
    static pod_singleton
        const SomePOD instance;

    template <class SomePOD>
    SomePOD const pod_singleton::instance = { /*optional contents*/ };

         some_pod const& _1 = pod_singleton<some_pod>::instance;

That's an unnamed namespace in a header.

Dave Abrahams
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at