目前我正在研究一个c框架,我想在其中嵌入一个c ++包。但是,发生了很多命名冲突。所以我决定在C ++源代码中添加一个命名空间。现在的问题是我应该在namespace {}块中移动#include“header.h”吗?我只花了一些时间来弄清楚由以下代码产生的错误。
原始C ++源代码
在a.h
#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添加到编译器抱怨没有声明这样的函数的所有函数调用中?
感谢您的回复。
答案 0 :(得分:0)
通常只需将指令using namespace
放在.cpp
文件中即可。
像那样:
using namespace MyAddedNameSpace;
void File::func(int fd)
{
close( fd );
}
希望有所帮助......