我需要在两个源文件中包含一些 typedef 定义:
typedef double mat[MATSIZE][MATSIZE] ;
所以我创建了 def.h,其中包括:
#ifndef DEF_H
#define DEF_H
typedef double mat[MATSIZE][MATSIZE] ;
#endif
在两个 .c 文件中,我通过以下方式包含了它:
在处理的第一个文件中:
#define MATSIZE 4
#include "def.h"
在第二个 .c 文件中:
extern int MATSIZE;
#include "def.h"
但是我明白了
error: variably modified ‘mat’ at file scope
我做错了什么?
最佳答案
可变长度数组 (VLA) 的概念是 C99 的"new"概念。
在 C99 之前,您只能使用实常量来指定数组的大小。以下代码在 block 范围或文件范围内都是非法的。
const int size = 42; /* size is not a real constant */
int boo[size];
C99 引入了 VLA block 范围。上面的示例代码是合法的 C99,前提是它发生在 block 范围内。您的定义在文件范围内,因此无效。
同样的 typedef 引用两种不同的类型也是一个非常糟糕的错误想法。
关于头文件中的 C typedef 在文件范围内可变修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637282/