零MQ的"expected ';' at the end of declaration list"错误

"expected ';' at the end of declaration list" error for zeromq

本文关键字:of declaration list 错误 end expected MQ at the      更新时间:2023-10-16

我正在使用Mac,我使用自制软件来安装zeromq。我想为我的应用程序使用 zeromq。我试图编译 zmq.hpp https://github.com/zeromq/cppzmq/blob/master/zmq.hpp

int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");
    while (true) {
        zmq::message_t request;
        //  Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;
        //  Do some 'work'
        sleep (1);
        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

但它失败了。错误显示

"frameworks/zmq

/zmq.hpp:377:35:错误:预期末尾的';" 声明列表 socket_t (常量 socket_t&) ZMQ_DELETED_FUNCTION; ^ ;frameworks/zmq/zmq.hpp:379:42:错误:声明列表末尾的预期";" void 运算符 = (常量 socket_t&) ZMQ_DELETED_FUNCTION;"

为什么会这样?zmq.hpp 代码不包含任何错误。请帮忙。

最后我这样做了,它奏效了。

#if __has_feature(cxx_deleted_functions)
        #define ZMQ_DELETED_FUNCTION = delete
    #else
        #define ZMQ_DELETED_FUNCTION
    #endif

多谢。奥德丽。

引入宏ZMQ_DELETED_FUNCTION显然是为了提供对"已删除函数"(= delete)等C++11功能的条件支持。您的编译器似乎不支持该 C++11 功能。因此错误。

根据设计,zmq.hpp尝试通过分析编译器版本并相应地定义宏来自动设置此宏。这种自动检测可能过于乐观。但是,您的编译器也可能实际上支持该功能,您只是忘记在编译器设置中打开它。

顺便说一句,我正在查看定义宏的代码的 Clang 部分

  #elif defined(__clang__)
    #if __has_feature(cxx_rvalue_references)
        #define ZMQ_HAS_RVALUE_REFS
    #endif
    #if __has_feature(cxx_deleted_functions)
        #define ZMQ_DELETED_FUNCTION = delete
    #endif

对我来说,它看起来很破碎。如果编译器不支持cxx_deleted_functions功能,则宏ZMQ_DELETED_FUNCTION将保持未定义状态(而不是定义为空)。这是错误的。

你在用叮当吗?如果是这样,这实际上可能是您错误的原因。在这种情况下,可以通过将ZMQ_DELETED_FUNCTION预定义为空宏来修复错误,无论是作为全局宏定义还是在包含zmq.hpp之前的源代码中。