【发布时间】:2012-04-03 14:27:41
【问题描述】:
目前我正在开发一个 c 框架,我想在其中嵌入一个 c++ 包。但是,会发生很多命名冲突。所以我决定在 C++ 源代码中添加一个命名空间。现在的问题是我应该在命名空间{}块中移动#include“header.h”吗?我刚刚花了一些时间找出一个由以下代码引起的错误。
原始 C++ 源代码
在一个.h
#include <unistd.h>
struct File
{
void func(int fd);
};
在 a.cpp 中
#include "a.h"
void File::func(int fd)
{
::close( fd );
}
我添加了这样的命名空间
新啊.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 添加到编译器抱怨没有声明此类函数的所有函数调用中?
感谢您的回复。
【问题讨论】:
-
#include <unistd.h>对您的情况没有害处。很明显,<unistd.h>对a.cpp是不可见的。
标签: c++ namespaces