Это один из грубых краев языка (ов) Си.Два объявления, которые выглядят одинаково (но для имен), одно в прототипе, а другое в качестве переменной стека, приводит к объявлению двух различных типов переменных.
void foo(int A[10]) {
int B[10];
}
Внутри области действия foo
, A
- это указатель на int , а B
- это массив из десяти элементов типа int
.Как уже упоминалось, даже их размеры, вычисленные с помощью sizeof
, различаются.
C ++ унаследовал правило, поэтому для вашего примера кода прототипы обеих функций должны быть одинаковыми.
C99 усложняетэто еще более важно, введя новое ключевое слово static
; -)
void foo(int A[static 10]) {
int B[10];
}
, это не меняет правила того, как A
и B
видны изнутри, но предоставляет информациюк вызывающей стороне, как ожидаются элементы массива.На данный момент gcc принимает этот новый синтаксис и просто игнорирует эту информацию.