Сбой компиляции Googletest при определении структуры в файле #imported

У меня есть два файла, first_pass.c, который включает mystring.h, описывающий mystring.c. Во время тестирования first_pass.c я сделал следующее:

#include "../src/mystring.c"
#include "../src/first_pass.c"
#include <gtest/gtest.h>

Все работало хорошо, пока мне не пришлось определять структуру в mystring.h. Просто как тот

typedef struct Split {
    char *head;
    char *tail;
}Split;

А потом у меня начались сбои при компиляции на error: ‘Split’ has a previous declaration as ‘typedef struct Split Split’

Требования к курсу включают использование C (не C++) и MAKE, поэтому другие среды тестирования, такие как Check, устарели. Я понимаю, что он дважды определяет структуру, первый раз, когда он загружает mystring.c, а другой - first_pass.c. Что я могу с этим поделать?


person eugen-fried    schedule 19.07.2013    source источник
comment
Почему вы определяете одну и ту же структуру дважды?   -  person nouney    schedule 19.07.2013
comment
# включение исходного файла (.c) напрашивается на неприятности   -  person doctorlove    schedule 19.07.2013
comment
Как я ответил ниже, у меня не было выбора. Файлы googletest представляют собой простые заголовки с макросами TEST, поэтому, чтобы иметь определение для моего тестируемого кода, я должен включить его целиком. Это была моя ссылка: meekrosoft.wordpress.com/2009/11/09/   -  person eugen-fried    schedule 19.07.2013


Ответы (3)


Используйте защиту заголовков, чтобы предотвратить включение заголовков более одного раза.

http://en.wikipedia.org/wiki/Include_guard

одно предложение добавить файлы заголовков в файлы C, а не файлы C в другой файл C.

person pradipta    schedule 19.07.2013
comment
Ты прав! Я читал об этом, но не думал, что это так. Спасибо! Я дам тебе чек, потому что ты был первым. - person eugen-fried; 19.07.2013

Лучший способ: не включать файлы '.c', а затем скомпилировать, чтобы разделить '.o' и связать их вместе.

Если многократное включение заголовка, такого как mystring.h, неизбежно, найдите защиту заголовка, например здесь, в SO

person Ingo Leonhardt    schedule 19.07.2013

Вам необходимо защитить определение структуры, как показано ниже.

#ifndef SOME_GUARD_NAME
#define SOME_GUARD_NAME

typedef struct Split {
    char *head;
    char *tail;
}Split;

#endif

Поскольку вы включаете файлы ".c", посмотрите здесь чтобы избежать всего этого бардака.

person Dayal rai    schedule 19.07.2013
comment
У меня не было выбора. Файлы googletest представляют собой простые заголовки с макросами TEST, поэтому, чтобы иметь определение для моего тестируемого кода, я должен включить его целиком. Но спасибо за хорошую образовательную ссылку. - person eugen-fried; 19.07.2013