我正在使用Mac,我使用自制软件来安装zeromq。我想在我的应用程序中使用zeromq。我尝试用
编译zmq.hpp https://github.com/zeromq/cppzmq/blob/master/zmq.hppint 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(const socket_t&amp;)ZMQ_DELETED_FUNCTION; ^ ; frameworks / zmq / zmq.hpp:379:42:错误:预期';'在声明清单的末尾 void operator =(const socket_t&amp;)ZMQ_DELETED_FUNCTION;“
为什么会这样? zmq.hpp代码不包含任何错误。请帮忙。
最后我这样做并且有效。
#if __has_feature(cxx_deleted_functions)
#define ZMQ_DELETED_FUNCTION = delete
#else
#define ZMQ_DELETED_FUNCTION
#endif
非常感谢。奥黛丽。
答案 0 :(得分:6)
显然引入宏ZMQ_DELETED_FUNCTION
是为了将“C ++ 11”功能作为“已删除的函数”(= delete
)提供条件支持。您的编译器似乎不支持该C ++ 11功能。因此错误。
按照设计,zmq.hpp
会尝试通过分析编译器版本并相应地定义宏来自动设置此宏。这种自动检测可能过于乐观。但是,您的编译器也可能实际支持该功能,您只是忘记在编译器设置中打开它。
BTW,我正在查看定义宏
的代码的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
之前的源代码中。