Как может быть декларационная конфликт с собой?

StackOverflow https://stackoverflow.com/questions/3553265

  •  30-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top