По историческим причинам язык C поддерживает два стиля объявлений функций (и определений).
«Новый» прототип на основе стиля
void foo(int a, short b, double c)
{
...
И "старый" стиль K & R
void foo(a, b, c)
int a;
short b;
double c;
{
...
Когда компилятор видит, что первый идентификатор в ()
является известным именем типа, он предполагает, что функция определена с прототипом. Когда компилятор видит, что первый идентификатор в ()
является , а не известным именем типа, он предполагает, что функция определена в старом стиле K & R. В последнем случае каждый идентификатор должен быть отделен от следующего ,
.
В вашем случае определение функции имеет tcpb
в качестве первого идентификатора в ()
. Очевидно, в вашей программе нет такого типа, что заставляет компилятор предполагать, что это не имя типа, а имя параметра в определении стиля K & R. Как таковое оно должно сопровождаться ,
.
Это явно не ваше намерение.
Итак, что такое tcpb
? Почему вы используете его как имя типа, если в вашей программе такого типа нет?
P.S. Разные компиляторы могут использовать разные подходы для распознавания неверного кода. По этой причине они могут по-разному обнаруживать одну и ту же ошибку и выдавать разные диагностические сообщения. Очевидно, ваш конкретный компилятор использует логику, описанную выше. Отсюда и сообщение об ошибке о запятой. Другой компилятор может сообщить об ошибке по-другому.