2016-01-19 4 views
4

В K & R Глава 1.9, я экспериментировал с программой, представленной ниже. В частности, что произойдет, если я удалю некоторые замедления функций.Почему возникает ошибка «конфликтующего типа» при выполнении этой программы?

Итак, я удалил строку # 4. INT GetLine (символ строка [], Int MaXLine

И программа выполняет отлично и функционирует должным образом, насколько я знаю.

Когда я удалить строки # 5. аннулируется копирование (символ на [], полукокс из []);

программа выдает следующее сообщение об ошибке:

yay.c: 37: 6: предупреждение: конфликтующие типов для 'копии' недействительной копия (символ на [], символ из [])

yay.c: 15: 9: примечание: предыдущее неявное объявление 'co py 'был здесь copy (longest, line);

#include <stdio.h> 
#define MAXLINE 1000 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

main() 
{ 
    int len; 
    int max; 
    char line[MAXLINE]; 
    char longest[MAXLINE]; 

    max = 0; 
    while ((len = getfatline(line, MAXLINE)) > 0) 

     if (len > max) { 
      max = len; 
      copy(longest, line); 
     } 

    if (max > 0) 
     printf("%s", longest); 

return 0; 
} 


int getfatline(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; 
} 

void copy(char to[], char from[]) 
{ 

     int i; 

     i = 0; 

     while ((to[i] = from[i]) != '\0') 
       ++i; 
} 

Может ли это объяснить мне это?

ответ

2

Согласно последнему стандарту C C11, каждая функция должна быть (как минимум) объявлена ​​до ее использования. Таким образом, компилятор будет иметь знания о сигнатуре функции.

В коде, при вызове функции, если заявление (по крайней мере) не видна компилятором (из-за какой-то унаследованной причине), компилятор (используется для) предположим

  • Функция возвращает int
  • принимает любое количество параметров.

Позже, когда вы определяете функцию с типом возврата, отличным от int, это создаст конфликт.

Вот почему,

  • удаления вперед декларации getline() не производит ошибку.
  • удаление прямого объявления copy() приводит к ошибке, несоответствию в типе возврата. не

Вдоль той же линии, main() больше не требуется, чтобы поддерживать, а неявное int также была удалена. Вы должны написать int main(void), по крайней мере, быть стандартным.

0

GetLine фактически определяется в в stdio.h заголовке

ssize_t getline(char **lineptr, size_t *n, FILE *stream); 

, следовательно, удаление свой собственный GetLine реализации не будет сгенерировано сообщение об ошибке. Вместо этого, удаляя другую функцию, выдается ошибка, потому что в stdio.h такая функция не существует, но она определяется пользователем.Кстати, в этом случае проблема, с которой вы сталкиваетесь, может быть просто решена путем удаления самой функции из программы.

0

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

void copy(char to[], char from[]); 

Но если вы не предоставите прототип, тип возвращаемого значения функции берется int по умолчанию.


Это причина, почему она работает для функции getfatline(), потому что его возвращаемый тип int, когда вы используете его позже в коде, который является таким же, как принято по умолчанию при удалении прототипа.

Но когда вы удалите прототип для функции copy, возвращаемый тип устанавливается в int по умолчанию, но ваше определение функции имеет тип возвращаемого void, то есть, где конфликт происходит, и он бросает ошибку.

Смежные вопросы