1

Тема: Сішний код у g++

Намагаюся прикрути сішну лібу до cpp. Підкажіть чому g++ не подобається goto

static void
AttributeReadCallback(UA_Client *client, void *userdata,
                      UA_UInt32 requestId, UA_ReadResponse *rr) {
    UA_AttributeReadContext *ctx = (UA_AttributeReadContext*)userdata;
    UA_LOG_DEBUG(&UA_Client_getConfig(client)->logger, UA_LOGCATEGORY_CLIENT,
                "Async read response for request %" PRIu32, requestId);

    /* Check the ServiceResult */
    UA_StatusCode res = rr->responseHeader.serviceResult;
    if(res != UA_STATUSCODE_GOOD)
        goto finish;

    /* Check result array size */
    if(rr->resultsSize != 1) {
        res = UA_STATUSCODE_BADINTERNALERROR;
        goto finish;
    }

    /* A Value attribute */
    UA_DataValue *dv = &rr->results[0];
    if(ctx->resultType == &UA_TYPES[UA_TYPES_DATAVALUE]) {
        ctx->userCallback(client, ctx->userContext, requestId,
                          UA_STATUSCODE_GOOD, dv);
        goto finish;
    }

    /* An ArrayDimensions attribute. Has to be an array of UInt32. */
    if(ctx->resultType == &UA_TYPES[UA_TYPES_VARIANT]) {
        if(dv->hasValue &&
           UA_Variant_hasArrayType(&dv->value, &UA_TYPES[UA_TYPES_UINT32])) {
            ctx->userCallback(client, ctx->userContext, requestId,
                              UA_STATUSCODE_GOOD, &dv->value);
        } else {
            res = UA_STATUSCODE_BADINTERNALERROR;
        }
        goto finish;
    }

    /* Check we have a scalar value of the right datatype */
    if(!dv->hasValue ||
       !UA_Variant_hasScalarType(&dv->value, ctx->resultType)) {
        res = UA_STATUSCODE_BADINTERNALERROR;
        goto finish;
    }

    /* Callback into userland */
    ctx->userCallback(client, ctx->userContext, requestId,
                      UA_STATUSCODE_GOOD, dv->value.data);

 finish://jump to label ‘finish’ [-fpermissive]
    if(res != UA_STATUSCODE_GOOD)
        ctx->userCallback(client, ctx->userContext, requestId, res, NULL);
    UA_free(ctx);
}

2

Re: Сішний код у g++

goto не стрибне через вказівник

UA_DataValue *dv = &rr->results[0];

3

Re: Сішний код у g++

https://exceptionshub.com/what-are-the- … ation.html
https://stackoverflow.com/questions/113 … ialization

4

Re: Сішний код у g++

OK.Там виправив, а от як бути з

ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

та

invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]

там того десь біля півтисячи проблемних місці буде... Можливо є якісь більше зворотньо-сумісні компілятори ?

5

Re: Сішний код у g++

Збирайте лібу як C і імпортуєте як extern "C".

Подякували: leofun01, ch0r_t2

6 Востаннє редагувалося ch0r_t (20.09.2021 13:55:02)

Re: Сішний код у g++

там того десь біля півтисячи проблемних місці буде... Можливо є якісь більше зворотньо-сумісні компілятори ?

Ви неначе, здалось мені, хочете писати C на C++... А це книжний зразок того чого не варто робити.
То інший звір. Вимикати слід тактику теслі при роботі на фрезувальній машині.

"зворотньо-сумісні" — що ви маєте під цим на увазі, у вас різних стандартів прогр.код на C++ ?

edit.
Правда, так краще. →

koala написав:

Збирайте лібу як C і імпортуєте як extern "C".

7 Востаннє редагувалося cheappi386 (20.09.2021 14:41:01)

Re: Сішний код у g++

зворотньо-сумісний з С

А це книжний зразок того чого не варто робити.

Де ? Бо мова йде про інтеграцію С ліби з кодом у С++

8

Re: Сішний код у g++

Намагаюся прикрути сішну лібу до cpp.

Мабуть, ви намагаєтеся то зробити інклюдом тіла функцій,  а це індусія. Інклюдити треба тільки заголовкові файли.

9 Востаннє редагувалося ch0r_t (20.09.2021 14:47:55)

Re: Сішний код у g++

зворотньо-сумісний з С
....
Бо мова йде про інтеграцію С ліби з кодом у С++

"Backward compatible refers to a hardware or software system that can use the interface of an older version of the same product."