2015-06-28 7 views
2

Я читал в разных местах, что функции, объявленные в main(), не могут быть вызваны из main. Но ниже программа fun3() объявляется внутри main() и вызывается external main() в других функциях, а IT WORKS, выдавая вывод 64.следует ссылку http://code.geeksforgeeks.org/7EZZxQ. Однако, если я меняю fun3() возвращаемый тип int на void, он не может скомпилировать, в чем причина такого поведения?Сфера применения функции в c

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    void fun1(int); 
    void fun2(int); 
    int fun3(int); 

    int num = 5; 
    fun1(num); 
    fun2(num); 
} 

void fun1(int no) 
{ 
    no++; 
    fun3(no); 
} 

void fun2(int no) 
{ 
    no--; 
    fun3(no); 

} 

int fun3(int n) 
{ 
    printf("%d",n); 
} 

ошибка в сборке, когда объявление fun3() изменено.

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
    void fun1(int); 
    void fun2(int); 
    void fun3(int);  //fun3 return type changed to void error in compilation 

    int num = 5; 
    fun1(num); 
    fun2(num); 
} 

void fun1(int no) 
{ 
    no++; 
    fun3(no); 
} 

void fun2(int no) 
{ 
    no--; 
    fun3(no); 

} 

void fun3(int n) //fun3 return type changed to void error in compilation 
{ 
    printf("%d",n); 
} 
+0

Хотя мой ответ - это обоснованное предположение, было бы полезно, если бы вы рассказали нам, какой компилятор вы используете, какую версию его и какую ошибку вы получаете при изменении аргумента (вероятно, мы также покажем нам измененный код). –

+1

Скомпилируйте все предупреждения ('-Wall -Wextra -pedantic' для gcc), прочитайте, что компилятор говорит вам (и может быть) получить просветленным. – alk

+0

@JoachimPileborg Я включил ссылку онлайн-компилятора в вопрос ... я обновлю код с тем, где его не получается :) – codeluv

ответ

2

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

Ни fun1, ни fun2объявитьfun3, прежде чем они его называют, и не видят в декларации main; декларация fun3 в main ограничивается телом main. В разделе C89 и ранее компилятор будет считать, что вызов fun3 возвращает int. В первом примере определение от fun3 возвращает int, поэтому код будет скомпилирован под компилятором C89. Во втором примере определение fun3 возвращает void, что не соответствует предполагаемому типу int, поэтому код не скомпилируется.

В соответствии с C99 и более поздними стандартами, ни фрагмент будет скомпилирован; компилятор больше не принимает неявное объявление int для вызова функции. Все функции должны быть явно объявлены или определены до их вызова.

1

Объявление действительно только в объеме они объявлены. Однако, в старых стандартах C компилятор был разрешен догадка объявление функции, если никто не существовал в момент вызова, который вероятно, что происходит в вашем случае: компилятор видит вызов fun3 в fun1, fun2 и fun3 и выводит (догадывает) типы аргументов на основе аргумента, передаваемого в вызове.

+0

Так что, по-вашему, возможно, они внедряют старые стандарты ..? А что насчет void ...почему он терпит неудачу с void fun3 (int)? @joachim pilebrog – codeluv

+0

@codeluv Я действительно не могу сказать, потому что я точно не знаю, какие изменения вы внесли или какие ошибки вы получили. –

+0

@codeluv Компилятор, когда он угадывает объявление функции, по умолчанию считается, что функция возвращает 'int', если фактическое определение функции отличается от того, что выводит компилятор, тогда вы получите сообщение об ошибке, поскольку декларация и определение не совпадение. –

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

  • Нет связанных вопросов^_^