Search code examples
c++namespaces

C++ conflicting namespaces


I am developing a C++ project in prj_cpp.h which starts as

// prj_cpp.h
#include "lib_cpp.h"
extern "C" {
#include "lib_c.h"
}

Where lib_cpp.h and lib_c.h are header files of external C++ and C libraries respectively.

External C++ library lib_cpp.h also uses lib_c in the following way.

// lib_cpp.h
namespace SOME_WEIRD_NAMESPACE {
extern "C" {
#include "lib_c.h"
}
}

Because lib_c.h prevents double inclusion, it turns out that all objects in lib_c.h reside in SOME_WEIRD_NAMESPACE which has nothing to do with my project prj_cpp.

On the other hand if my header file looks like

// prj_cpp.h
extern "C" {
#include "lib_c.h"
}
#include "lib_cpp.h"

I break the external C++ project because there is nothing under SOME_WEIRD_NAMESPACE because I include lib_c.h first.

I am not allowed to modify neither lib_cpp.h nor lib_c.h

Is there anything I can do in my prj_cpp.h to resolve such an issue?

I do not like very much using SOME_WEIRD_NAMESPACE in my project because that namespace has nothing to do with it. Moreover, the number of lib_c.h headers files can be large.


Solution

  • If you use lib_cpp.h more than lib_c.h, replace #include lib_c.h with the following wrapper:

    // lib_c_wrapper.h
    namespace SOME_WEIRD_NAMESPACE {
    extern "C" {
    #include "lib_c.h"
    }
    }
    

    If you use lib_c.h more than lib_cpp.h use the following wrapper:

    // lib_cpp_wrapper.h
    #define SOME_WEIRD_NAMESPACE YOUR_NAMESPACE
    #include "lib_cpp.h"
    

    This is a workaround to solve the problem.