2015-05-30 4 views
3

я наткнулся на этот кусок кода в C:Функция без возвращаемого типа, указанный в C

#include <stdio.h> 
main() 
{ 
int i = 5; 
workover(i); 
printf("%d",i); 
} 
workover(i) 
int i; 
{ 
i = i*i; 
return(i); 
} 

Я хочу знать, как объявление функции «капитального ремонта» действует? Что происходит, когда мы не упоминаем возвращаемый тип функции? (мы можем вернуть что-нибудь?). Параметр также является просто именем переменной, как это работает?

ответ

10

Если вы не укажете тип возврата или тип параметра, C неявно объявит его как int.

Это «функция» из более ранних версий C (C89 и C90), но в настоящее время считается плохой практикой. Поскольку стандарт C99 (1999) уже больше не позволяют этого, компилятор ориентации C99 или более поздней версии, скорее всего, даст вам предупреждение похожее на следующее:

синтаксис
program.c: At top level: 
program.c:8:1: warning: return type defaults to ‘int’ 
workover(i) 
^ 
3

Функция декларации была использована в более ранних версиях C, и все еще действителен, поэтому фрагмент кода «workover (i) int i;» эквивалентно «капитальному ремонту (int i)». Хотя, я думаю, он все равно может генерировать предупреждения или даже ошибки, в зависимости от того, какие параметры компилятора вы используете.

+1

Это * не * по-прежнему в силе: «[* C99 является, по большей части, обратная совместимость с C89, но строже в некотором роде. ** В частности, декларация, в которой отсутствует спецификатор типа, уже не подразумевает «int». ***] (https://en.wikipedia.org/wiki/C99#Design) «Вот почему может быть создано предупреждение , – Frxstrem

+0

Эти два не совсем эквивалентны; 'workover (i) int i;' не является прототипом, а 'workover (int i)' is. Это похоже на разницу между 'int main()' и 'int main (void)' –

0

Когда я скомпилировать код, как $ gcc common.c -o common.exe -Wall (Попытка его на Cygwin терминале, как я не моя система Linux со мной прямо сейчас)

я получаю следующие предупреждения:

common.c:3:1: warning: return type defaults to ‘int’ [-Wreturn-type] 
main() 
^ 
common.c: In function ‘main’: 
common.c:6:2: warning: implicit declaration of function ‘workover’ [-Wimplicit-f     unction-declaration] 
workover(i); 
^ 
common.c: At top level: 
common.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type] 
workover(i) 
^ 
common.c: In function ‘main’: 
common.c:8:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
  1. Первый и третий говорит: return type defaults to ‘int’, что означает, что если вы не укажете тип возврата, компилятор будет неявно объявить его как int.
  2. Второй говорит, implicit declaration of function ‘workover’, поскольку компилятор не знает, что такое workover.
  3. Третье предупреждение довольно просто понять и исчезнет, ​​если вы исправите первый.

Вы должны сделать это таким образом:

#include <stdio.h> 

int workover(int); 

int i; 

int main(void) 
{ 
    int i = 5; 
    workover(i); 
    printf("%d",i);  //prints 5 
    return 0; 
} 

int workover(int i) 
{ 
    i = i*i; //i will have local scope, so after this execution i will be 25; 
    return(i); //returns 25 
} 
Смежные вопросы