Нужно ли объявлять прототип на C? - PullRequest
0 голосов
/ 25 января 2012

Когда я не объявляю прототип функции и не имею единственной функции, она запускается. Однако, когда у меня более одной функции, она выдает ошибку:

несоответствие типов в объявлении "имя-функции"

#include <conio.h>
#include <stdio.h>

float area1(float, float);
float area (float, float);

void main()
{
   float x;
   float y;
   float a;
   float z;
   clrscr();
   x = 5.0;
   y = 5.0;
   z = area(x, y);
   a = area1(x, y);
   printf("%f", z);
   printf("%f", a);
   getch();
}

void area(float a, float b)
{
   int c;
   c = 0.5 * a * b;
   return c;
}

void area1(float a, float b)
{
   int c;
   c = 0.5 * a * b;
   return c;
}

Ответы [ 4 ]

3 голосов
/ 25 января 2012

Обычно вы хотите создать прототип функции перед использованием.Количество функций не имеет значения, но порядок имеет значение.Существует два типичных способа выполнения действий:

  1. Запись функций в основном в обратном порядке, с функциями самого низкого уровня в начале файла и функциями более высокого уровня (которые используют функции более низкого уровня)следующим образом.
  2. Используйте отдельные прототипы (обычно в заголовке), предшествующие реализации функций.
2 голосов
/ 20 июня 2012

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

2 голосов
/ 25 января 2012

Существует несколько различных правил, но в целом:

  1. Если компилятор видит прототип перед первым вызовом функции - он знает, что делать.

  2. Если компилятор видит саму функцию перед первым вызовом - он знает, что делать.

  3. Если ни один из первых 2 не верен, компилятор придумываетпрототип, основанный на том, как вы вызвали функцию.Если последующие вызовы не соответствуют «изобретенному» прототипу - вы получите сообщение об ошибке.Вы также можете получить ошибку вместо неявного прототипирования, если ваш компилятор строгий.

какую книгу мне следует

Я бы предложилначиная с K & R .Есть много других (и более современных) книг, но, по моему скромному мнению, K & R является первым, когда вы имеете дело с Си.

1 голос
/ 25 января 2012

Я не вижу, чтобы это указывалось в любом месте, поэтому, я думаю, я сделаю это: ваш прототип объявляет функции area и area1 как возвращающие float и принимая 2 параметра float, но вы реализуете их как возвращающие пустоты И у вас есть оператор return внутри них, что должно заставить компилятор кричать на вас.

Во-вторых, вы пытаетесь присвоить переменной int значение с плавающей запятой, которое в значительной степени неопределено, поэтому, хотя компилятор может пропустить это, это тоже не то, что вам нужно. Поэтому, как предложили мудрые люди, возьмите хорошую книгу на Си.

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