目前我正在研究ac框架,我想在其中嵌入一个c ++包.但是,发生了很多命名冲突.所以我决定在C++源代码中添加一个命名空间.现在的问题是我应该在namespace {}块中移动#include"header.h"吗?我只花了一些时间来弄清楚由以下代码产生的错误.
原始C++源码
在啊
#include <unistd.h>
struct File
{
void func(int fd);
};
Run Code Online (Sandbox Code Playgroud)
在a.cpp
#include "a.h"
void File::func(int fd)
{
::close( fd );
}
Run Code Online (Sandbox Code Playgroud)
我添加了这样的命名空间
新啊
namespace MyAddedNameSpace
{
#include <unistd.h>
struct File
{
void func(int fd);
};
}
Run Code Online (Sandbox Code Playgroud)
新的a.cpp
#include "a.h"
namespace MyAddedNameSpace
{
void File::func(int fd)
{
::close( fd );
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:: close()尚未声明.
我将#include指令放在命名空间块中的原因是因为我导入的c ++包也使用#ifndef标志来包含头文件,如下所示.所以我认为简单的方法是将所有代码放在命名空间块{}中
#ifndef
#include <header1.h>
#include <header2.h>
...
#else
#include <header3.h>
#include <header4.h>
...
#endif
Run Code Online (Sandbox Code Playgroud)
现在我通过在cpp文件中添加额外的行来解决这个问题
#include <unistd.h> //new added line
#include "a.h"
namespace MyNameSpace
{
void File::func(int fd)
{
::close( fd );
}
}
Run Code Online (Sandbox Code Playgroud)
但是我对这个解决方案不满意,因为unistd.h头已经包含在啊,但是在命名空间MyAddedNameSpace里面,或者我应该将前缀MyNameSpace添加到编译器抱怨没有声明这样的函数的所有函数调用中?
谢谢回复.
ald*_*ldo 27
您不应该#include在自己的命名空间中放置指令.你所做的就是将所有内容unistd.h放在命名空间中; 因此,过去(::close()现在应该保留!)现在被宣布为MyAddedNameSpace::close().这不是你想要的.
#include <unistd.h>在.cpp文件顶部添加行的"解决方案" 可以解决问题,但仅限于此.cpp文件.你所做的是以正确的方式包含库头(没有你的命名空间),然后当你的头(啊)被包含时,它#include <unistd.h>再次(这次在你的命名空间内),但这次是该文件中的包含警卫防止它再次被处理.所以对于这个 .cpp文件你没问题,但任何其他文件#include <a.h>都会遇到你原来遇到的同样问题.
可能有一些罕见的情况,你有充分的理由#include在你自己的命名空间中使用,但你很可能会包括一个你自己的标题(或一些其他文件) - 不是库标题! - 即便如此,它可能不是理想的解决方案.
在啊
#include <unistd.h>
namespace MyAddedNameSpace {
struct File
{
void func(int fd);
};
}
Run Code Online (Sandbox Code Playgroud)
在a.cpp
#include "a.h"
namespace MyAddedNameSpace {
void File::func(int fd)
{
::close( fd );
}
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*hko -1
通常将指令放入文件using namespace中就足够了.cpp。像那样:
using namespace MyAddedNameSpace;
void File::func(int fd)
{
close( fd );
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你..
| 归档时间: |
|
| 查看次数: |
12432 次 |
| 最近记录: |