错误:'bool' 和 'int' 类型的无效操作数转换为二进制 'operator<=> - (GCC 10 - std=gnu++20)

问题描述

在发布支持 c++20 后,我有一些 c++ 项目,我想将我的 makefile std support 17 升级到 20,在那之后我的编译器(gcc10.2)给了我这样的错误

Error

In file included from /usr/local/lib/gcc10/include/c++/bits/node_handle.h:39,from /usr/local/lib/gcc10/include/c++/bits/stl_tree.h:72,from /usr/local/lib/gcc10/include/c++/map:60,from Asyncsql.h:10,from Asyncsql.cpp:4:
/usr/local/lib/gcc10/include/c++/optional: In function 'constexpr std::strong_ordering std::operator<=>(const std::optional<_Tp>&,std::nullopt_t)':
/usr/local/lib/gcc10/include/c++/optional:1052:24: error: invalid operands of types 'bool' and 'int' to binary 'operator<=>'
 1052 |     { return bool(__x) <=> false; }
      |              ~~~~~~~~~ ^~~
      |              |
      |              bool
gmake[2]: *** [Makefile:23: Asyncsql.o] Error 1

这是我的 Asyncsql.cpp ;

#include <sys/time.h>
#include <cstdlib>
#include <cstring>
#include "Asyncsql.h"
#define MUTEX_LOCK(mtx)   pthread_mutex_lock(mtx)
#define MUTEX_UNLOCK(mtx) pthread_mutex_unlock(mtx)

CAsyncsql::CAsyncsql(): m_stHost (""),m_stUser (""),m_stPassword (""),m_stDB (""),m_stLocale (""),m_imsgCount (0),m_iPort (0),m_bEnd (false),m_hThread (0),m_mtxQuery (NULL),m_mtxResult (NULL),m_iQueryFinished (0),m_ulThreadID (0),m_bConnected (false),m_icopiedQuery (0)
{
    memset (&m_hDB,sizeof (m_hDB));

    m_aiPipe[0] = 0;
    m_aiPipe[1] = 0;
}

CAsyncsql::~CAsyncsql()
{
    Quit();
    Destroy();
}

void CAsyncsql::Destroy()
{
    if (m_hDB.host)
    {
        sys_log (0,"Asyncsql: closing MysqL connection.");
        MysqL_close (&m_hDB);
        m_hDB.host = NULL;
    }

    if (m_mtxQuery)
    {
        pthread_mutex_destroy (m_mtxQuery);
        delete m_mtxQuery;
        m_mtxQuery = NULL;
    }

    if (m_mtxResult)
    {
        pthread_mutex_destroy (m_mtxResult);
        delete m_mtxResult;
        m_mtxQuery = NULL;
    }
}

void* AsyncsqlThread (void* arg)
{
    CAsyncsql* psql = ((CAsyncsql*) arg);

    if (!psql->Connect())
    {
        return NULL;
    }

    psql->ChildLoop();
    return NULL;
}

bool CAsyncsql::QueryLocaleSet()
{
    if (0 == m_stLocale.length())
    {
        sys_err ("m_stLocale == 0");
        return true;
    }

    if (MysqL_set_character_set (&m_hDB,m_stLocale.c_str()))
    {
        sys_err ("cannot set locale %s by 'MysqL_set_character_set',errno %u %s",m_stLocale.c_str(),MysqL_errno (&m_hDB),MysqL_error (&m_hDB));
        return false;
    }

    sys_log (0,"\t--MysqL_set_character_set(%s)",m_stLocale.c_str());

    return true;
}

bool CAsyncsql::Connect()
{
    if (0 == MysqL_init (&m_hDB))
    {
        fprintf (stderr,"MysqL_init Failed\n");
        return false;
    }

    if (!m_stLocale.empty())
    {
        if (MysqL_options (&m_hDB,MysqL_SET_CHARSET_NAME,m_stLocale.c_str()) != 0)
        {
            fprintf (stderr,"MysqL_option Failed : MysqL_SET_CHARSET_NAME %s ",MysqL_error(&m_hDB));
        }
    }

    if (!MysqL_real_connect (&m_hDB,m_stHost.c_str(),m_stUser.c_str(),m_stPassword.c_str(),m_stDB.c_str(),m_iPort,NULL,CLIENT_MULTI_STATEMENTS))
    {
        fprintf (stderr,"MysqL_real_connect: %s\n",MysqL_error(&m_hDB));
        return false;
    }

    my_bool reconnect = true;

    if (0 != MysqL_options (&m_hDB,MysqL_OPT_RECONNECT,&reconnect))
    {
        fprintf (stderr,"MysqL_option: %s\n",MysqL_error(&m_hDB));
    }



    m_ulThreadID = MysqL_thread_id (&m_hDB);

    m_bConnected = true;
    return true;
}

bool CAsyncsql::Setup (CAsyncsql* sql,bool bNoThread)
{
    return Setup (sql->m_stHost.c_str(),sql->m_stUser.c_str(),sql->m_stPassword.c_str(),sql->m_stDB.c_str(),sql->m_stLocale.c_str(),bNoThread,sql->m_iPort);
}

bool CAsyncsql::Setup (const char* c_pszHost,const char* c_pszUser,const char* c_pszPassword,const char* c_pszDB,const char* c_pszLocale,bool bNoThread,int iPort)
{
    m_stHost = c_pszHost;
    m_stUser = c_pszUser;
    m_stPassword = c_pszPassword;
    m_stDB  = c_pszDB;
    m_iPort = iPort;

    if (c_pszLocale)
    {
        m_stLocale = c_pszLocale;
        sys_log (0,"Asyncsql: locale %s",m_stLocale.c_str());
    }

    if (!bNoThread)
    {
        m_mtxQuery  = new pthread_mutex_t;
        m_mtxResult = new pthread_mutex_t;

        if (0 != pthread_mutex_init (m_mtxQuery,NULL))
        {
            perror ("pthread_mutex_init");
            exit (0);
        }

        if (0 != pthread_mutex_init (m_mtxResult,NULL))
        {
            perror ("pthread_mutex_init");
            exit (0);
        }

        pthread_create (&m_hThread,AsyncsqlThread,this);

        return true;
    }
    else
    {
        return Connect();
    }
}

void CAsyncsql::Quit()
{
    m_bEnd = true;
    m_sem.Release();

    if (m_hThread)
    {
        pthread_join (m_hThread,NULL);
        m_hThread = NULL;
    }
}

sqlMsg* CAsyncsql::DirectQuery (const char* c_pszQuery)
{
    if (m_ulThreadID != MysqL_thread_id (&m_hDB))
    {
        sys_log (0,"MysqL connection was reconnected. querying locale set");
        while (!QueryLocaleSet());
        m_ulThreadID = MysqL_thread_id (&m_hDB);
    }

    sqlMsg* p = new sqlMsg;

    p->m_pksql = &m_hDB;
    p->iID = ++m_imsgCount;
    p->stQuery = c_pszQuery;

    if (MysqL_real_query (&m_hDB,p->stQuery.c_str(),p->stQuery.length()))
    {
        char buf[1024];

        snprintf (buf,sizeof(buf),"Asyncsql::DirectQuery : MysqL_query error: %s\nquery: %s",MysqL_error (&m_hDB),p->stQuery.c_str());

        sys_err (buf);
        p->uisqlErrno = MysqL_errno (&m_hDB);
    }

    p->Store();
    return p;
}

void CAsyncsql::AsyncQuery (const char* c_pszQuery)
{
    auto p = new sqlMsg;

    p->m_pksql = &m_hDB;
    p->iID = ++m_imsgCount;
    p->stQuery = c_pszQuery;

    PushQuery (p);
}

void CAsyncsql::ReturnQuery (const char* c_pszQuery,void* pvUserData)
{
    auto p = new sqlMsg;

    p->m_pksql = &m_hDB;
    p->iID = ++m_imsgCount;
    p->stQuery = c_pszQuery;
    p->bReturn = true;
    p->pvUserData = pvUserData;

    PushQuery (p);
}

void CAsyncsql::PushResult (sqlMsg* p)
{
    MUTEX_LOCK (m_mtxResult);

    m_queue_result.push (p);

    MUTEX_UNLOCK (m_mtxResult);
}

bool CAsyncsql::PopResult(sqlMsg** pp)
{
    MUTEX_LOCK (m_mtxResult);

    if (m_queue_result.empty())
    {
        MUTEX_UNLOCK (m_mtxResult);
        return false;
    }

    *pp = m_queue_result.front();
    m_queue_result.pop();
    MUTEX_UNLOCK (m_mtxResult);
    return true;
}

void CAsyncsql::PushQuery (sqlMsg* p)
{
    MUTEX_LOCK (m_mtxQuery);

    m_queue_query.push (p);
    m_sem.Release();

    MUTEX_UNLOCK (m_mtxQuery);
}

bool CAsyncsql::PeekQuery (sqlMsg** pp)
{
    MUTEX_LOCK (m_mtxQuery);

    if (m_queue_query.empty())
    {
        MUTEX_UNLOCK (m_mtxQuery);
        return false;
    }

    *pp = m_queue_query.front();
    MUTEX_UNLOCK (m_mtxQuery);
    return true;
}

bool CAsyncsql::PopQuery (int iID)
{
    MUTEX_LOCK (m_mtxQuery);

    if (m_queue_query.empty())
    {
        MUTEX_UNLOCK (m_mtxQuery);
        return false;
    }

    m_queue_query.pop();
    MUTEX_UNLOCK (m_mtxQuery);
    return true;
}

bool CAsyncsql::PeekQueryFromcopyQueue (sqlMsg** pp)
{
    if (m_queue_query_copy.empty())
    {
        return false;
    }

    *pp = m_queue_query_copy.front();
    return true;
}

int CAsyncsql::copyQuery()
{
    MUTEX_LOCK (m_mtxQuery);

    if (m_queue_query.empty())
    {
        MUTEX_UNLOCK (m_mtxQuery);
        return -1;
    }

    while (!m_queue_query.empty())
    {
        sqlMsg* p = m_queue_query.front();
        m_queue_query_copy.push (p);
        m_queue_query.pop();
    }
    int count = m_queue_query_copy.size();

    MUTEX_UNLOCK (m_mtxQuery);
    return count;
}

bool CAsyncsql::PopQueryFromcopyQueue()
{
    if (m_queue_query_copy.empty())
    {
        return false;
    }

    m_queue_query_copy.pop();
    return true;
}

int CAsyncsql::GetcopiedQueryCount()
{
    return m_icopiedQuery;
}

void CAsyncsql::ResetcopiedQueryCount()
{
    m_icopiedQuery = 0;
}

void CAsyncsql::AddcopiedQueryCount (int icopiedQuery)
{
    m_icopiedQuery += icopiedQuery;
}

DWORD CAsyncsql::CountQuery()
{
    return m_queue_query.size();
}

DWORD CAsyncsql::CountResult()
{
    return m_queue_result.size();
}

void __timediff (struct timeval* a,struct timeval* b,struct timeval* rslt)
{
    if (a->tv_sec < b->tv_sec)
    {
        rslt->tv_sec = rslt->tv_usec = 0;
    }
    else if (a->tv_sec == b->tv_sec)
    {
        if (a->tv_usec < b->tv_usec)
        {
            rslt->tv_sec = rslt->tv_usec = 0;
        }
        else
        {
            rslt->tv_sec = 0;
            rslt->tv_usec = a->tv_usec - b->tv_usec;
        }
    }
    else
    {
        rslt->tv_sec = a->tv_sec - b->tv_sec;

        if (a->tv_usec < b->tv_usec)
        {
            rslt->tv_usec = a->tv_usec + 1000000 - b->tv_usec;
            rslt->tv_sec--;
        }
        else
        {
            rslt->tv_usec = a->tv_usec - b->tv_usec;
        }
    }
}

class cProfiler
{
public:
    cProfiler()
    {
        m_nInterval = 0 ;

        memset (&prev,sizeof (prev));
        memset (&Now,sizeof (Now));
        memset (&interval,sizeof (interval));

        Start();
    }

    cProfiler (int nInterval = 100000)
    {
        m_nInterval = nInterval;

        memset (&prev,sizeof (interval));

        Start();
    }

    void Start()
    {
        gettimeofday (&prev,(struct timezone*) 0);
    }

    void Stop()
    {
        gettimeofday (&Now,(struct timezone*) 0); 
        __timediff (&Now,&prev,&interval);
    }

    bool IsOk()
    {
        if (interval.tv_sec > (m_nInterval / 1000000))
        {
            return false;
        }

        if (interval.tv_usec > m_nInterval)
        {
            return false;
        }

        return true;
    }

    struct timeval* GetResult()
    {
        return &interval;
    }
    long GetResultSec()
    {
        return interval.tv_sec;
    }
    long GetResultUSec()
    {
        return interval.tv_usec;
    }

private:
    int m_nInterval;
    struct timeval prev;
    struct timeval Now;
    struct timeval interval;
};

void CAsyncsql::ChildLoop()
{
    cProfiler profiler(500000);

    while (!m_bEnd)
    {
        m_sem.Wait();

        int count = copyQuery();

        if (count <= 0)
        {
            continue;
        }

        AddcopiedQueryCount (count);

        sqlMsg* p;

        while (count--)
        {
            profiler.Start();

            if (!PeekQueryFromcopyQueue (&p))
            {
                continue;
            }

            if (m_ulThreadID != MysqL_thread_id (&m_hDB))
            {
                sys_log (0,"MysqL connection was reconnected. querying locale set");
                while (!QueryLocaleSet());
                m_ulThreadID = MysqL_thread_id (&m_hDB);
            }

            if (MysqL_real_query (&m_hDB,p->stQuery.length()))
            {
                p->uisqlErrno = MysqL_errno (&m_hDB);

                sys_err ("Asyncsql: query Failed: %s (query: %s errno: %d)",p->uisqlErrno);

                switch (p->uisqlErrno)
                {
                    case CR_SOCKET_CREATE_ERROR:
                    case CR_CONNECTION_ERROR:
                    case CR_IPSOCK_ERROR:
                    case CR_UNKNowN_HOST:
                    case CR_SERVER_GONE_ERROR:
                    case CR_CONN_HOST_ERROR:
                    case ER_NOT_KEYFILE:
                    case ER_CRASHED_ON_USAGE:
                    case ER_CANT_OPEN_FILE:
                    case ER_HOST_NOT_PRIVILEGED:
                    case ER_HOST_IS_BLOCKED:
                    case ER_PASSWORD_NOT_ALLOWED:
                    case ER_PASSWORD_NO_MATCH:
                    case ER_CANT_CREATE_THREAD:
                    case ER_INVALID_USE_OF_NULL:
                        m_sem.Release();
                        sys_err ("Asyncsql: retrying");
                        continue;
                }
            }

            profiler.Stop();

            if (!profiler.IsOk())
            {
                sys_log (0,"[QUERY : LONG INTERVAL(OverSec %ld.%ld)] : %s",profiler.GetResultSec(),profiler.GetResultUSec(),p->stQuery.c_str());
            }

            PopQueryFromcopyQueue();

            if (p->bReturn)
            {
                p->Store();
                PushResult (p);
            }
            else
            {
                delete p;
            }

            ++m_iQueryFinished;
        }
    }

    sqlMsg* p;

    while (PeekQuery (&p))
    {
        if (m_ulThreadID != MysqL_thread_id (&m_hDB))
        {
            sys_log (0,"MysqL connection was reconnected. querying locale set");
            while (!QueryLocaleSet());
            m_ulThreadID = MysqL_thread_id (&m_hDB);
        }

        if (MysqL_real_query (&m_hDB,p->stQuery.length()))
        {
            p->uisqlErrno = MysqL_errno (&m_hDB);

            sys_err ("Asyncsql::ChildLoop : MysqL_query error: %s:\nquery: %s",p->stQuery.c_str());

            switch (p->uisqlErrno)
            {
                case CR_SOCKET_CREATE_ERROR:
                case CR_CONNECTION_ERROR:
                case CR_IPSOCK_ERROR:
                case CR_UNKNowN_HOST:
                case CR_SERVER_GONE_ERROR:
                case CR_CONN_HOST_ERROR:
                case ER_NOT_KEYFILE:
                case ER_CRASHED_ON_USAGE:
                case ER_CANT_OPEN_FILE:
                case ER_HOST_NOT_PRIVILEGED:
                case ER_HOST_IS_BLOCKED:
                case ER_PASSWORD_NOT_ALLOWED:
                case ER_PASSWORD_NO_MATCH:
                case ER_CANT_CREATE_THREAD:
                case ER_INVALID_USE_OF_NULL:
                    continue;
            }
        }

        sys_log (0,"QUERY_FLUSH: %s",p->stQuery.c_str());

        PopQuery (p->iID);

        if (p->bReturn)
        {
            p->Store();
            PushResult (p);
        }
        else
        {
            delete p;
        }

        ++m_iQueryFinished;
    }
}

int CAsyncsql::CountQueryFinished()
{
    return m_iQueryFinished;
}

void CAsyncsql::ResetQueryFinished()
{
    m_iQueryFinished = 0;
}

MysqL* CAsyncsql::GetsqlHandle()
{
    return &m_hDB;
}

size_t CAsyncsql::Escapestring (char* dst,size_t dstSize,const char* src,size_t srcSize)
{
    if (0 == srcSize)
    {
        memset (dst,dstSize);
        return 0;
    }

    if (0 == dstSize)
    {
        return 0;
    }

    if (dstSize < srcSize * 2 + 1)
    {
        char tmp[256];
        size_t tmpLen = sizeof (tmp) > srcSize ? srcSize : sizeof (tmp);
        strlcpy (tmp,src,tmpLen);

        sys_err ("Fatal error!! not enough buffer size (dstSize %u srcSize %u src%s: %s)",dstSize,srcSize,tmpLen != srcSize ? "(trimmed to 255 characters)" : "",tmp);

        dst[0] = '\0';
        return 0;
    }

    return MysqL_real_escape_string (GetsqlHandle(),dst,srcSize);
}

void CAsyncsql2::SetLocale (const std::string & stLocale)
{
    m_stLocale = stLocale;
    QueryLocaleSet();
}

这是我的 Asyncsql.h

#ifndef __INC_METIN_II_ASYNCsql_H__
#define __INC_METIN_II_ASYNCsql_H__

#include "../../libthecore/src/stdafx.h"
#include "../../libthecore/src/log.h"
#include "../../Ayarlar.h"
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <MysqL/server/MysqL.h>
#include <MysqL/server/errmsg.h>
#include <MysqL/server/MysqLd_error.h>
#include "Semaphore.h"

typedef struct _sqlResult
{
    _sqlResult(): psqlResult (NULL),uiNumRows (0),uiAffectedRows (0),uiInsertID (0) {}

    ~_sqlResult()
    {
        if (psqlResult)
        {
            MysqL_free_result (psqlResult);
            psqlResult = NULL;
        }
    }

    MysqL_RES* psqlResult;
    uint32_t uiNumRows;
    uint32_t uiAffectedRows;
    uint32_t uiInsertID;
} sqlResult;

typedef struct _sqlMsg
{
    _sqlMsg() : m_pksql (NULL),iID (0),uiResultPos (0),pvUserData (NULL),bReturn (false),uisqlErrno (0) {}

    ~_sqlMsg()
    {
        auto first = vec_pkResult.begin();
        auto past  = vec_pkResult.end();

        while (first != past)
        {
            delete * (first++);
        }

        vec_pkResult.clear();
    }

    void Store()
    {
        do
        {
            sqlResult* pRes = new sqlResult;

            pRes->psqlResult = MysqL_store_result (m_pksql);
            pRes->uiInsertID = MysqL_insert_id (m_pksql);
            pRes->uiAffectedRows = MysqL_affected_rows (m_pksql);

            if (pRes->psqlResult)
            {
                pRes->uiNumRows = MysqL_num_rows (pRes->psqlResult);
            }
            else
            {
                pRes->uiNumRows = 0;
            }

            vec_pkResult.push_back (pRes);
        }
        while (!MysqL_next_result (m_pksql));
    }

    sqlResult* Get()
    {
        if (uiResultPos >= vec_pkResult.size())
        {
            return NULL;
        }

        return vec_pkResult[uiResultPos];
    }

    bool Next()
    {
        if (uiResultPos + 1 >= vec_pkResult.size())
        {
            return false;
        }

        ++uiResultPos;
        return true;
    }

    MysqL* m_pksql;
    int iID;
    std::string stQuery;

    std::vector<sqlResult *> vec_pkResult;
    unsigned int uiResultPos;

    void* pvUserData;
    bool  bReturn;

    unsigned int uisqlErrno;
} sqlMsg;

class CAsyncsql
{
public:
    CAsyncsql();
    virtual ~CAsyncsql();

    void Quit();

    bool Setup (const char* c_pszHost,bool bNoThread = false,int iPort = 0);
    bool Setup (CAsyncsql* sql,bool bNoThread = false);

    bool Connect();
    bool IsConnected()
    {
        return m_bConnected;
    }
    bool QueryLocaleSet();

    void AsyncQuery  (const char* c_pszQuery);
    void ReturnQuery (const char* c_pszQuery,void* pvUserData);
    sqlMsg* DirectQuery (const char* c_pszQuery);

    DWORD CountQuery();
    DWORD CountResult();

    void PushResult (sqlMsg* p);
    bool PopResult  (sqlMsg** pp);

    void ChildLoop();

    MysqL* GetsqlHandle();

    int  CountQueryFinished();
    void ResetQueryFinished();

    size_t Escapestring (char* dst,size_t srcSize);

protected:
    void Destroy();
    void PushQuery (sqlMsg* p);

    bool PeekQuery (sqlMsg** pp);
    bool PopQuery  (int iID);

    bool PeekQueryFromcopyQueue (sqlMsg** pp );
    INT  copyQuery();
    bool PopQueryFromcopyQueue();

public:
    int  GetcopiedQueryCount();
    void ResetcopiedQueryCount();
    void AddcopiedQueryCount (int icopiedQuery);

protected:
    MysqL m_hDB;

    std::string m_stHost;
    std::string m_stUser;
    std::string m_stPassword;
    std::string m_stDB;
    std::string m_stLocale;

    int m_imsgCount;
    int m_aiPipe[2];
    int m_iPort;

    std::queue<sqlMsg*> m_queue_query;
    std::queue<sqlMsg*> m_queue_query_copy;
    std::queue<sqlMsg*> m_queue_result;

    volatile bool m_bEnd;

    pthread_t m_hThread;
    pthread_mutex_t* m_mtxQuery;
    pthread_mutex_t* m_mtxResult;

    CSemaphore m_sem;

    int m_iQueryFinished;

    unsigned long m_ulThreadID;
    bool m_bConnected;
    int  m_icopiedQuery;
};

class CAsyncsql2 : public CAsyncsql
{
public:
    void SetLocale (const std::string & stLocale);
};

#endif

这就是函数出错的原因;

可选:1052;

    #ifdef __cpp_lib_three_way_comparison
  template<typename _Tp>
    constexpr strong_ordering
    operator<=>(const optional<_Tp>& __x,nullopt_t) noexcept
    { return bool(__x) <=> false; }
#else

在看到微软发布的文档后,我将尝试 false;像这样再次出错..

此致。

解决方法

我不知道为什么它看起来是 bool(__x) false 作为 bool 和 int 比较。 我认为您之前包含的文件中有一些奇怪的宏,以包含将破坏标准代码的标头。 我建议您尝试将标准标题移至标准标题上方,然后将其移至“用户定义”标题下方。

import cv2

# Load the cascade
face_cascade = cv2.CascadeClassifier('cascade.xml')
# To capture video from webcam.
cap = cv2.VideoCapture(0)
# To use a video file as input
# cap = cv2.VideoCapture('filename.mp4')

while True:
    # Read the frame
    _,img = cap.read()
    original = img
    # Convert to grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # Detect the faces
    faces = face_cascade.detectMultiScale(gray,1.1,4)
    # Draw the rectangle around each face
    for (x,y,w,h) in faces:
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,0),10)
    # Display
    cv2.imshow('img',img)
    #cv2.imshow('original',original)
    # Stop if escape key is pressed
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
# Release the VideoCapture object
cap.release()

编辑: 我已经找到了问题的原因。 在“libthrecore/stdafx.h”中定义的宏(我拥有使用作者的文件,它们是公开的)。

#include <string>
#include <queue>
#include <vector>
#include <map>
#include <mysql/server/mysql.h>
#include <mysql/server/errmsg.h>
#include <mysql/server/mysqld_error.h>
#include "../../libthecore/src/stdafx.h"
#include "../../libthecore/src/log.h"
#include "../../Ayarlar.h"
#include "Semaphore.h"

它导致 false 被读取为 int 并导致飞船操作员失败并显示作者显示的错误。上移标准标题或删除宏以解决错误。