Google test: странное поведение при тестировании кода на C

#c #googletest

#c #googletest

Вопрос:

Я пытаюсь протестировать свой код на C с помощью Google test (никогда раньше с ним не работал), но, похоже, он думает, что я хочу протестировать код на C

 23: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
     str->data = malloc(buf_size   1);
33: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
         char *new_begin = malloc(buf_size   1);
  

Мой файл тестирования (если вместо включения исходного файла я включаю заголовок, он завершается с ошибкой во время тестирования (или, может быть, даже раньше)

 #include <gtest/gtest.h>
extern "C" {
#include "../lib/scr/c_string.c"
}
  

В целом, я только что изменил код для

 str->data = (char*)malloc(buf_size   1);
  

как это работает на C . К счастью, ничего не разбилось 🙂

Комментарии:

1. str->data = malloc(buf_size 1); Это работает как есть на C, но требует приведения в C . Похоже, вместо этого вы компилируете файл C как C . Почему #include "../lib/scr/c_string.c" и зачем » тестировать мой код на C » с помощью .cpp файла?

2. Я пытаюсь включить свой файл C, как в некоторых примерах, которые я видел в Интернете. что вы подразумеваете под использованием cpp? Насколько я знаю, я не могу создать файл C для Google test.

3. Предполагая LibTests.cpp , что это ваш файл, он компилируется как C , потому .cpp что это расширение по умолчанию для файлов C . Но вы #include добавляете в него простой код на C, который не будет компилироваться как C , потому что C — это (связанный, но) другой язык. Это приводит к сбою компиляции с указанными вами ошибками.

4. Хм, хорошо, вы правы. Я должен найти какой-то другой способ протестировать свой код. Спасибо

Ответ №1:

extern «C» не превращает включенный исходный код в C, он определяет соглашение о связывании для использования для объявлений, которые встречаются в блоке, в который вы включили свой файл.

Другими словами, содержимое вашего файла C копируется в исходный файл C и компилируется как C с использованием соглашений о связывании C.