У меня есть предварительное объявление структуры, как показано ниже в 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, чтобы использовать его указатель внутри себя
typedef
не является предварительным объявлением. Простой struct Command_t;
— это предварительная декларация.
В C++ указатель this содержит адрес текущего объекта класса. Вы не можете использовать его здесь, потому что это ключевое слово.
@AndrewHenle Я изменил struct Command_t; typedef struct Command_t{...}
, но получил ошибку unknown type name 'Command_t'
на void base_ctor(Command_t *pbase);
@KrishnaKanthYenumula да, я написал это на C и не заметил, что «это» является зарезервированным словом в C++
@KrishnaKanthYenumula Почему? OP компилирует этот код с помощью компиляторов C и C++.
@KrishnaKanthYenumula Я имею в виду, что, поскольку я скомпилировал его с помощью gcc, я подумал, что это правильно, поэтому не заметил ключевого слова «этот». Все, что я ожидаю от ошибки, было всем, кроме ключевого слова «это». Я использовал глагол прошедшего времени, который имел в виду, прежде чем узнал, что «это» является причиной
@ s4eed Я знаю, что это старо, но я просто хочу оставить «ответ» на будущее: typedef struct X X;
— это очень распространенный прием в C, используемый для того, чтобы вам не приходилось писать struct X
везде, где вы хотите его использовать. В C++ семантика была изменена, и она больше не нужна (но не является неправильной для кода, предназначенного как для C, так и для C++).
Здесь:
int32_t (*fpInit)(struct Command_t* this);
Вы получаете сообщение об ошибке, потому что this
является ключевым словом в C++ и поэтому не может использоваться в качестве идентификатора. Вам нужно изменить имя на другое.
... и, как вы, @ahban, только что обнаружили, extern "C"
- это не волшебное средство "заставьте это работать на C++".
Пожалуйста, проверьте приведенный ниже код, для 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);
};
не могли бы вы объяснить больше, что вы намереваетесь?
Почему вы набрали Command_t для Command_t?