В настоящее время я работаю над 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 ко всем вызовам функций, где компилятор жалуется, что такая функция не объявлена?
Спасибо за ответ.