Ошибка иметь одинаковое имя параметра дважды, поскольку имена параметров находятся в области видимости в списке параметров. Я думаю, очевидно, что два параметра с одинаковым именем бесполезны?
// Explain why you want to have them say "int a, int a"
int func(int a, int b);
В C разрешено определять содержимое структурных типов в списках типов параметров. Идентификатор тега имеет либо область видимости прототипа, либо область видимости блока (когда функция является определением) и не имеет связи, что означает, что он отличается от структуры, объявленной вне прототипа или блоков, чей идентификатор тега имеет область видимости файла. Вы не можете вызывать такую функцию, кроме как рекурсивно изнутри ее тела.
int func(struct x{int a;} y) {
func(y); // fine (the call, not the endless recursion)
}
Обратите внимание, что это применимо только к вызовам, которые происходят в той же единице перевода, в которой определен func
. Если в другой единице перевода вы объявляете функцию и структуру следующим образом, это вполне нормально, и функция будет вызываться (вам нужно убедиться, что вышеприведенное объявление не видно, в противном случае вы получите конфликт, потому что x
в обеих точках обозначает другой тип).
struct x {int a;};
int func(struct x y);
В обеих единицах перевода, даже если x
- это разный тип (поскольку они являются разными единицами перевода), типы совместимы , что является единственным, что имеет значение для типов параметров.
Вы можете определить не только структуру в списке параметров, но и в разделе возвращаемого типа функции
struct x {int a;} func(void) {
return (struct x){ 0 };
}
Это также относится только к C. В C ++ такое не допускается.