1

私は Mac を使用しており、homebrew を使用して 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 (const socket_t&) ZMQ_DELETED_FUNCTION; ^ ; frameworks/zmq/zmq.hpp:379:42: エラー: 予想される ';' 宣言リストの最後に void operator = (const socket_t&) ZMQ_DELETED_FUNCTION;"

なぜこれが起こったのですか?zmq.hpp コードにはエラーは含まれていません。助けてください。

最後に私はこれを行い、うまくいきました。

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

どうもありがとう。オードリー。

4

1 に答える 1

6

このマクロZMQ_DELETED_FUNCTIONは、「削除された関数」などの C++11 機能の条件付きサポートを提供するために導入されたようです ( = delete)。あなたのコンパイラはその 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は (空として定義されるのではなく) 未定義のままになります。これは間違っています。

Clangを使用していますか?もしそうなら、これが実際にあなたのエラーの理由である可能性があります. ZMQ_DELETED_FUNCTIONその場合、グローバル マクロ定義として、または を含める前にソース コードで、空のマクロとして事前定義することで、エラーを修正できますzmq.hpp

于 2013-01-30T17:32:34.673 に答える