2016-02-19 1 views
3

Почему этот код с объявлением целого в середине нигде (определение функции между ними), не выдавая ошибку?Почему переменная функции, объявленной вне ее определения функции, не выдает ошибку?

1) Почему это синтаксически правильно.
2) Какая польза от этого.?


#include <stdio.h> 
void func(int, int); 
int main() 
{ 
    int a, b; 
    a = 10; 
    b = 20; 
    func(a, b); 

    return 0; 
} 
void func(i, j) 
int i,j;     //why does this doesn't throw error. 
{ 
    printf("a = i = %d\nb = j = %d\n", i, j); 
} 
+0

Как было сказано ниже, это синтаксически правильно, потому что оно действительно - это оригинальный способ. Использовать этот синтаксис сейчас нет, но, если вы не используете компилятор стиля K & R, который не поддерживает ANSI C. – mah

+0

И не используйте ** EVER **, чтобы обеспечить прототип функции, определенной в стиле K & R. Чтобы узнать, почему, измените 'int' на' char' в прототипе функции, а также в определении. –

ответ

3

TL; DR - K & R стиль.

В коде

void func(i, j) 
int i,j; { 

не бросает ошибку, потому что был а (только) действительный синтаксис, когда-то давно.

В настоящее время находится не является недопустимым, но не используется больше.

Вы можете узнать больше о K&R style syntax here, если хотите.

1

Этот

void func(i, j) 
int i,j; //declare types of arguments 
{ 
    //function body 
} 

называется K&R синтаксис. Он устарел, но все еще используется в некоторых проектах C, таких как bash.

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