Что означают конфликтующие типы ошибок для ''? - PullRequest
3 голосов
/ 21 июля 2009

я получил сообщение об ошибке «ошибка: конфликтующие типы для« ____ ». Что это значит?

Ответы [ 4 ]

11 голосов
/ 26 января 2010

Quickfix:

Убедитесь, что ваши функции объявлены один раз и только один раз, прежде чем они будут вызваны. Например, изменить:

main(){ myfun(3.4); }
double myfun(double x){ return x; }

Кому:

double myfun(double x){ return x; }
main(){ myfun(3.4); }

Или добавить отдельное объявление функции:

double myfun(double x);
main(){ myfun(3.4); }
double myfun(double x){ return x; }

Возможные причины ошибки

  1. Функция была вызвана до объявления
  2. Определенная функция переопределяет функцию, объявленную во включенном заголовке.
  3. Функция была определена дважды в одном файле
  4. Декларация и определение не совпадают
  5. Объявление конфликта во включенных заголовках

Что на самом деле происходит

error: conflicting types for ‘foo’ означает, что функция была определена более одного раза с разными сигнатурами типов.

Файл, содержащий две функции с одинаковыми именами, но с разными типами возвращаемых значений, выдает эту ошибку, например:

int foo(){return 1;}
double foo(){return 1.0;}

Действительно, при компиляции с GCC мы получаем следующие ошибки:

foo.c:5:8: error: conflicting types for ‘foo’
 double foo(){return 1.0;}
        ^
foo.c:4:5: note: previous definition of ‘foo’ was here
 int foo(){return 1;}
     ^

Теперь, если бы вместо этого у нас был файл с двумя определениями функций с одинаковым именем

double foo(){return 1;}
double foo(){return 1.0;}

Вместо этого мы получили бы ошибку 'redefinition':

foo.c:5:8: error: redefinition of ‘foo’
 double foo(){return 1.0;}
        ^
foo.c:4:8: note: previous definition of ‘foo’ was here
 double foo(){return 1;}
        ^

Неявное объявление функции

Так почему следующий код выдает error: conflicting types for ‘foo’?

 main(){ foo(); }
 double foo(){ return 1.0; }

Причина: неявное объявление функции .

Когда компилятор впервые встретит foo() в функции main, он примет сигнатуру типа для функции foo из int foo(). По умолчанию предполагается, что неявные функции возвращают целые числа, а типы входных аргументов являются производными от того, что вы передаете в функцию (в данном случае - ничего).

Очевидно, что компилятор ошибочен, чтобы сделать это предположение, но спецификации языка C (и, следовательно, Objective-C) старые, капризные и не очень умные. Может быть, неявное объявление функций сэкономило время на разработку, снизив сложность компилятора, но теперь мы застряли с ужасной функцией, которая никогда не должна была попасть в язык. Фактически, неявные декларации были объявлены незаконными в C99.

Тем не менее, когда вы знаете, что происходит, должно быть легко найти основную причину вашей проблемы.

3 голосов
/ 16 января 2011

вероятно, потому что ваша функция " _ " уже существует в вашей библиотеке Это случилось со мной с этой функцией:

Я использовал stdio.h

int getline (char s [], int lim) { int c, i;

for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
if (c == '\n') {
    s[i] = c;
    ++i;
}
s[i] = '\0';
return i;

}

Когда я изменил getline на getlinexxx и скомпилировал его gcc:

int getlinexxx (char s [], int lim) { int c, i;

for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
if (c == '\n') {
    s[i] = c;
    ++i;
}
s[i] = '\0';
return i;

}

И проблема исчезла

0 голосов
/ 24 июля 2009

Если вы пытаетесь назначить его из вызова, который возвращает NSMutableDictionary, это, вероятно, ваша проблема. Размещение строки кода определенно поможет диагностировать предупреждения и ошибки в ней.

0 голосов
/ 21 июля 2009

Какой тип данных '___'?

Я предполагаю, что вы пытаетесь инициализировать переменную типа, который не может принять начальное значение. Как сказать int i = "hello";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...