【问题标题】:How to resolve C++ member function vs C function with the same name?如何解析 C++ 成员函数与 C 函数同名?
【发布时间】: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; - 因为您实际上并没有使用命名空间,而是定义其中的内容?
  • 除非绝对必要,否则不要在自己的头文件中包含其他文件。这些包含应该在源文件中,而不是头文件中。此外,不要在命名空间中包含标头,因为所有类型定义、结构和函数也将在该命名空间中,但不是预处理器宏(这些文件有很多,即使它大多是普通的“常量”。 )

标签: c sockets


【解决方案1】:

在 C 版本前加上 ::

if (::listen(listener, 10) == -1) {
   ...
}

即使用全局命名空间。

【讨论】:

    【解决方案2】:

    你想要::listen(listener,10)

    这将告诉编译器查看全局范围。

    【讨论】:

      【解决方案3】:

      首先,您应该将所有#includes 移出命名空间tcp。要区分类监听和 C 监听,您只需调用 C listen 函数的 Server::listen(或在类成员函数内监听)和 ::listen(或仅在类成员函数外监听)。

      【讨论】:

        【解决方案4】:

        您不应该混淆std 命名空间。只需写::listen 即可引用全局命名空间中的符号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-23
          • 1970-01-01
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          相关资源
          最近更新 更多