【问题标题】:Naming conflicts. C++ and OS libs (Plain C)命名冲突。 C++ 和操作系统库(纯 C)
【发布时间】:2012-10-31 05:03:46
【问题描述】:

我想为 Linux Socket API 编写一个 C++ 包装器。我的包装器的方法应该与 API 的底层函数名称相同。

但例如在 bind() 方法中,我使用了 Linux 套接字 API 中的普通 C 函数 bind() 。我调用bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr)),它与 API 函数的签名兼容。我的编译器在抱怨Invalid arguments 'Candidates are: bool bind(int)' 这是指我的方法inline bool Socket::bind(int portno)

为什么 Eclipse 引用包装函数,我如何禁止 Eclipse 这样做?

【问题讨论】:

    标签: c++ c eclipse g++


    【解决方案1】:

    您必须添加一个全局范围限定符:

    ::bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    

    范围解析决定了编译器在哪里查找名称。您可以在名称前加上命名空间和/或类范围(例如 socket_wrapper::socket::bind())。还有全局范围,系统功能通常存在的地方。这些函数可能以全局范围限定符 ::bind() 为前缀,因此编译器知道不使用同名的本地方法。

    还有std命名空间,标准库的类和函数都存放在这里。如果您想使用标准库,请在这些名称前加上 std::(例如 std::iostream, std::cout, std::string, std::vector<>, ...)。

    【讨论】:

    【解决方案2】:

    请使用命名空间。 明确!

    此外,在您的情况下,C 调用应使用 :: 前缀 ::bind 进行引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 2020-02-10
      • 1970-01-01
      • 2018-12-09
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多