В настоящее время я работаю над фреймворком c и хочу встроить в него пакет c ++. Однако возникает множество конфликтов имен. Поэтому я решил добавить пространство имен в исходный код C ++. Теперь вопрос в том, должен ли я переместить #include "header.h" в блок namespace {}? Я просто потратил некоторое время, чтобы выяснить ошибку, которая возникла из следующих кодов.
Исходный код C ++
В часах
#include <unistd.h>
struct File
{
void func(int fd);
};
В a.cpp
#include "a.h"
void File::func(int fd)
{
::close( fd );
}
И я добавил пространство имен вот так
Новый a.h
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 уже был включен в a.h, но внутри пространства имен MyAddedNameSpace, или я должен добавить префикс MyNameSpace ко всем вызовам функций, когда компилятор жалуется, что такая функция не объявлена?
Спасибо за ответ.