【发布时间】:2011-12-09 12:06:17
【问题描述】:
我在 server.h 中有一个服务器类:
namespace tcp{
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
class Server{
private:
int listener; //socket fd
public:
/* ...... */
void run();
int listen();
/* ...... */
}
}
在 server.cpp 中:
usinge namespace tcp;
void Server::run(){
/* ...do something to get socket for listening...*/
listen();
/* ...do something else...*/
}
int Server::listen(){
if (listen(listener, 10) == -1){
perror("listen");
exit(3)
}
}
编译器无法区分 Server::listen() 调用和 listen() 系统调用。我的解决方案是将#include 指令包装在命名空间std 中。但是,我不确定如果其他文件包含那些系统头文件或其他一些问题是否会发生冲突。除了改名还有什么建议吗?
【问题讨论】:
-
我不确定,但我认为
::listen()应该适合你 -
在 cpp 文件中最好是
namespace tcp { ... [Server::run(), Server::listen()] ... }而不是using namespace tcp;- 因为您实际上并没有使用命名空间,而是定义其中的内容? -
除非绝对必要,否则不要在自己的头文件中包含其他文件。这些包含应该在源文件中,而不是头文件中。此外,不要在命名空间中包含标头,因为所有类型定义、结构和函数也将在该命名空间中,但不是预处理器宏(这些文件有很多,即使它大多是普通的“常量”。 )