Когда массивы определены вне блока (в области файла или в глобальной области), размер должен быть известен во время компиляции. Это означает, что каждое измерение в массиве должно быть постоянным интегральным значением (или, для первого измерения, оно может подразумеваться инициализатором для массива).
Если вы использовали компилятор C89, вы можете получить сообщение о непостоянных измерениях массива. GCC 4.6.1 выдает сообщение «изменяющееся значение mat
в области действия файла».
C99 добавил массивы переменной длины в репертуар, но они могут появляться только внутри блока или списка аргументов, где размер можно определить во время выполнения.
Итак, в функции вы могли бы законно написать:
extern int MATSIZE;
extern void func(void);
void func(void)
{
typedef double mat[MATSIZE][MATSIZE];
// ...
}
(Объявление функции необходимо, чтобы избежать таких предупреждений, как:
warning: no previous prototype for ‘func’ [-Wmissing-prototypes]
так как я обычно компилирую с -Wmissing-prototypes
.)
Другая проблема заключается в том, что в одном файле MATSIZE
является константой времени компиляции (#define
d); в другой, по-видимому, существует целочисленная переменная MATSIZE
. Это совершенно не связано. Типы поэтому разные.
typdef - область действия блока
wildplasser касается того, является ли typedef
областью действия блока или глобальной. Он имеет блочную область видимости, так как этот исполняемый код демонстрирует:
#include <stdio.h>
static void function(void)
{
typedef int i;
i j = 1;
printf("j = %d\n", j);
{
typedef double i;
i j = 2.1;
printf("j = %f\n", j);
}
{
typedef char i[12];
i j = "this works";
printf("j = %s\n", j);
}
}
int main(void)
{
function();
return(0);
}
Если бы он был представлен мне для проверки кода, он был бы отклонен. Тем не менее, это наглядно демонстрирует точку.