Как может быть декларационная конфликт с собой?
Вопрос
Это ошибка, которую я получаю при попытке компилировать какой-то код, который использует TAUCS (не мой код):
.../taucs/src/taucs.h:554: error: conflicting declaration ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
.../taucs/src/taucs.h:554: error: ‘taucs_ccs_matrix’ has a previous declaration as ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
Wat? Это противоречит с собой?
После того, как я ущипнул себя, я создал тестовый заголовок и положил в противоречивое определение, просто чтобы убедиться, что я был прав в этом:
В файле Testit.h:
#include "somethingelse.h"
typedef struct
{
int n;
} foobar;
В файле foreelse.h:
typedef struct
{
int n;
} foobar;
Конечно, я получаю:
testit.h:6: error: conflicting declaration ‘typedef struct foobar foobar’
somethingelse.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
Или если у меня есть это в Testit.h:
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
Номер линии всегда отличается - декларация не может противоречить самостоятельно. Я не понимаю. Кто-нибудь когда-либо видел это?
Решение
Может ли это, что ваш файл заголовка (.../taucs/src/taucs.h
), который содержит декларацию, (прямо или косвенно) включено дважды на два отдельных #include
Директивы?
Другие советы
Один заголовок включен в несколько исходных файлов? Если это так, вам нужно обернуть его в «Включить охранники», как так:
#ifndef TAUCS_H
#define TAUCS_H
//Header stuff here
#endif //TAUCS_H
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
В этом примере вы даете 2 объявления о FOOBAR. Компилятор не знает, какой из них выбрать - так что его зарубеют с противоречивой декларацией. Вы не можете объявить то же самое дважды.
Не повторяйте определение. C ++ позволяет только определению только один раз. То, что вы можете сделать, это повторить декларацию.
А. typedef
всегда определение. Так что первое, что я бы порекомендовал, дает struct
Правильное имя (и так как это C ++, Typedef не добавляет никакой выгоды, так что просто перестаньте Typedef):
// file1.h
struct foobar
{
int n;
};
Далее, это должно быть в одном файле. Если у вас есть файлы, которые используют только указатели в FOOBAR, вы можете повторить декларацию (просто не определение):
// file2.h
// This is just a declaration so this can appear as many times as
// you want
struct foobar;
void doit(const foobar *f);
У меня была такая же проблема, расслабимая мой код, и это было нет Двойная декларация типа. PC-Lint пожаловался на тот же тип Typedef, используемый в смешанном C и C ++. Я мог бы починить это, избегая того же декларации в C а также C ++ файлы. Надеюсь, это поможет кому-то.