указатель на функцию в c? - PullRequest
0 голосов
/ 15 апреля 2020

Я изучаю c (программирование в ANSI c -> пятое издание) и сталкиваюсь со следующей проблемой:

Я реализую одну программу с указателями на функции

#include<stdio.h>

//void swap (int *a, int *b);                      //function declaration
int main() 
{
  int m = 25;
  int n = 100;

  printf("m is %d, n is %d\n", m, n);
  swap(&m, &n);                                    //calling a function
  printf("m is %d, n is %d\n", m, n);
  return 0;

}

void swap (int *a, int *b)                         //function implementation
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

в вышеприведенной программе прокомментируйте строку void swap (int *a, int *b);, затем файл запуска программы, но дайте одно предложение здесь, сталкиваясь с проблемой , почему здесь дают предложение

main. c: 10: 3 : warning: неявное объявление функции 'swap' [-Wimplicit-function-объявление]
main. c: 16: 6: warning: конфликтующие типы для 'swap'
main. c: 10: 3: примечание: предыдущее неявное объявление 'swap' было здесь
m равно 25, n равно 100
m равно 100, n равно 25

когда я раскомментирую эту строку void swap (int *a, int *b);, тогда программа работает нормально

#include<stdio.h>

void swap (int *a, int *b);                      //function declaration
int main() 
{
  int m = 25;
  int n = 100;

  printf("m is %d, n is %d\n", m, n);
  swap(&m, &n);                                    //calling a function
  printf("m is %d, n is %d\n", m, n);
  return 0;

}

void swap (int *a, int *b)                         //function implementation
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

, проблема в том, почему не разрешено это в вышеуказанной программе

void swap (int, int);              //function declaration

и выдайте ошибку

ошибка:

конфликтующие типы для 'swap' void swap (int * a, int * b) // реализация функции

* 10 37 * но в книге пример допустим

enter image description here

1 Ответ

1 голос
/ 15 апреля 2020
void swap (int *a, int *b); 

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

void swap (int *a, int *b){
...
}

Но такую ​​же сигнатуру функции можно записать как

void swap (int *, int *);

А не

void swap (int , int ); //This will result in type mismatch

Полагаю, это то, о чем вы спрашиваете.

ПРИМЕЧАНИЕ: здесь важно предварительное объявление, которое позволяет сначала объявить, а потом определить, что помогает поддерживать читабельность кода.

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