Почему переменная функции, объявленная вне определения ее функции, не вызывает ошибку?

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

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);
}

person Joses Paul    schedule 19.02.2016    source источник
comment
Как указано ниже, это синтаксически правильно, потому что это действительно - это оригинальный способ, которым все было сделано. Сейчас нет смысла использовать этот синтаксис, если только вы не используете компилятор в стиле K&R, который не поддерживает ANSI C.   -  person mah    schedule 19.02.2016
comment
И не НИКОГДА не предоставляйте прототип функции, определенной в стиле K&R. Чтобы узнать почему, измените int на char в прототипе функции, а также в определении.   -  person Andrew Henle    schedule 19.02.2016


Ответы (2)


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

В вашем коде

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

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

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

Вы можете прочитать больше о синтаксисе стиля K&R здесь, если хотите.

person Sourav Ghosh    schedule 19.02.2016

Этот

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

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

person PSkocik    schedule 19.02.2016