Должен ли я включать заголовочный файл в пространство имен?

В настоящее время я работаю над C-фреймворком и хочу встроить в него пакет C++. Тем не менее, есть много конфликтов имен. Поэтому я решил добавить пространство имен в исходный код C++. Теперь вопрос в том, должен ли я переместить #include "header.h" в блок пространства имен {}? Я просто потратил некоторое время, чтобы выяснить ошибку, которая возникла из-за следующих кодов.

Оригинальный исходный код C++

В ah

#include <unistd.h>
struct File 
{
     void func(int fd);
}; 

В a.cpp

#include "a.h"
void File::func(int fd)
{
    ::close( fd );
}

И я добавил такое пространство имен

Новый ah

namespace MyAddedNameSpace 
{ 
    #include <unistd.h>
    struct File 
    {
        void func(int fd);
    }; 
}

Новый a.cpp

#include "a.h"
namespace MyAddedNameSpace 
{
    void File::func(int fd)
    {
        ::close( fd );
    }
}

И компилятор жалуется, что ::close () не объявлено.

Причина, по которой я поместил директиву #include внутрь блока пространства имен, заключается в том, что импортированный пакет c++ также использует флаг #ifndef для включения файлов заголовков следующим образом. Поэтому я думаю, что самый простой способ — поместить все коды в блок пространства имен {}

#ifndef 
    #include <header1.h> 
    #include <header2.h>
    ...
#else 
    #include <header3.h>
    #include <header4.h>
    ...
#endif

Теперь я решил эту проблему, добавив дополнительную строку в файл cpp

#include <unistd.h>  //new added line 
#include "a.h"
namespace MyNameSpace 
{
    void File::func(int fd)
    {
        ::close( fd );
    }
}

Но меня это решение не устраивает, поскольку заголовок unistd.h уже был включен в ах, но внутри пространства имен MyAddedNameSpace, или я должен добавить префикс MyNameSpace ко всем вызовам функций, где компилятор жалуется, что такая функция не объявлена?

Спасибо за ответ.

7
задан Christopher 19 March 2012 в 03:01
поделиться