Проблема с компиляцией проекта C в модульном тесте C++

У меня есть предварительное объявление структуры, как показано ниже в C Я добавил googletest и хочу протестировать свой код, используя Я добавил extern "C" в свой файл test.cpp, но получаю сообщение об ошибке

файл baseCommand.h

typedef struct Command_t Command_t;

struct Command_t{

    uint8_t id;
    uint8_t procId;
    uint8_t priority;
    char initCommand[50];
    char command[50]; 
    char commandParam[450];
    char finishParam[10];
    int32_t (*fpInit)(struct Command_t* this);
    uint16_t initDelayMs;
    int32_t (*fpSend)(struct Command_t* this);
    uint16_t sendDelayMs;
    int32_t (*fpReceive)(struct Command_t* this);
    char expectedAnswerOnSucessCommand[100];
    char expectedAnswerOnError[100];
    uint16_t receiveDelayMs;
    int32_t (*fpProc)(struct Command_t* this);
    int8_t retry;
    void (*fpReset)(void);
    int port;
    int32_t (*fpCtor)(struct Command_t* this);
};

файл test.cpp

extern "C" {

#include "commands/baseCommand.h"


}

# include "gtest/gtest.h"


TEST(IntegerFunctionTest, negative) {
    
        EXPECT_EQ(1, 1);

}

но я получил ошибку (обновлено, я удалил некоторые не связанные файлы)

ожидается ',' или '...' перед 'этим' baseCommand.h

В сети

int32_t (fpInit) (структура Command_t this);

Почему вы набрали Command_t для Command_t?

s4eed 24.12.2020 14:37

Я готов декольировать Command_t, чтобы использовать его указатель внутри себя

Ahmad Banshee 24.12.2020 14:39

typedef не является предварительным объявлением. Простой struct Command_t; — это предварительная декларация.

Andrew Henle 24.12.2020 14:47

В C++ указатель this содержит адрес текущего объекта класса. Вы не можете использовать его здесь, потому что это ключевое слово.

Krishna Kanth Yenumula 24.12.2020 14:58

@AndrewHenle Я изменил struct Command_t; typedef struct Command_t{...}, но получил ошибку unknown type name 'Command_t' на void base_ctor(Command_t *pbase);

Ahmad Banshee 24.12.2020 15:06

@KrishnaKanthYenumula да, я написал это на C и не заметил, что «это» является зарезервированным словом в C++

Ahmad Banshee 24.12.2020 15:10

@KrishnaKanthYenumula Почему? OP компилирует этот код с помощью компиляторов C и C++.

Andrew Henle 24.12.2020 15:12

@KrishnaKanthYenumula Я имею в виду, что, поскольку я скомпилировал его с помощью gcc, я подумал, что это правильно, поэтому не заметил ключевого слова «этот». Все, что я ожидаю от ошибки, было всем, кроме ключевого слова «это». Я использовал глагол прошедшего времени, который имел в виду, прежде чем узнал, что «это» является причиной

Ahmad Banshee 24.12.2020 15:37

@ s4eed Я знаю, что это старо, но я просто хочу оставить «ответ» на будущее: typedef struct X X; — это очень распространенный прием в C, используемый для того, чтобы вам не приходилось писать struct X везде, где вы хотите его использовать. В C++ семантика была изменена, и она больше не нужна (но не является неправильной для кода, предназначенного как для C, так и для C++).

Yksisarvinen 31.12.2020 00:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
137
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь:

int32_t (*fpInit)(struct Command_t* this);

Вы получаете сообщение об ошибке, потому что this является ключевым словом в C++ и поэтому не может использоваться в качестве идентификатора. Вам нужно изменить имя на другое.

... и, как вы, @ahban, только что обнаружили, extern "C" - это не волшебное средство "заставьте это работать на C++".

John Bollinger 24.12.2020 15:02

Пожалуйста, проверьте приведенный ниже код, для q, «Я объявляю, что команда использует свой указатель внутри себя - ах, бан 28 минут назад»

    typedef struct Command_t * Command_tp;

    struct Command_t {

        uint8_t id;
        uint8_t procId;
        uint8_t priority;
        char initCommand[50];
        char command[50];
        char commandParam[450];
        char finishParam[10];
        //int32_t (*fpInit)(struct Command_t* this);
        int32_t (*fpInit)(Command_tp);
        uint16_t initDelayMs;
        //int32_t (*fpSend)(struct Command_t* this);
        int32_t (*fpSend)(Command_tp);
        uint16_t sendDelayMs;
        //int32_t (*fpReceive)(struct Command_t* this);
        int32_t (*fpReceive)(Command_tp);
        char expectedAnswerOnSucessCommand[100];
        char expectedAnswerOnError[100];
        uint16_t receiveDelayMs;
        //int32_t (*fpProc)(struct Command_t* this);
        int32_t (*fpProc)(Command_tp);
        int8_t retry;
        void (*fpReset)(void);
        int port;
        //int32_t (*fpCtor)(struct Command_t* this);
        int32_t (*fpCtor)(Command_tp);
    };

не могли бы вы объяснить больше, что вы намереваетесь?

Ahmad Banshee 24.12.2020 15:34

Другие вопросы по теме