Как объявление может конфликтовать с самим собой?

Это ошибка, которую я получаю, когда пытаюсь скомпилировать код, который использует 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;

В файле someelse.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’

Номер строки всегда отличается - объявление не может конфликтовать с самим собой. Я не понимаю Кто-нибудь когда-либо видел это?

8
задан eeeeaaii 24 August 2010 в 02:58
поделиться

4 ответа

Может ли быть так, что ваш заголовочный файл (. ../taucs/src/taucs.h), который содержит объявление, (прямо или косвенно) включен дважды двумя отдельными директивами #include?

6
ответ дан 5 December 2019 в 07:33
поделиться
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. Компилятор не знает, какое из них выбрать - поэтому вылетает с противоречивым объявлением. Вы не можете объявить одну и ту же вещь дважды.

1
ответ дан 5 December 2019 в 07:33
поделиться

Включен ли один заголовок в несколько исходных файлов? Если это так, вам нужно заключить это в «включить охранников» следующим образом:

#ifndef TAUCS_H
#define TAUCS_H

//Header stuff here

#endif //TAUCS_H
15
ответ дан 5 December 2019 в 07:33
поделиться

Не повторяйте определение. В 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); 
0
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: