头文件中的 C typedef 在文件范围内可变修改

标签 c header typedef

我需要在两个源文件中包含一些 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/

相关文章:

c - 表示地理表面地形图的二维数组算法

android - iOS和Android通用随机数生成器

c - C中多个文件中的静态二维数组

c++ - 这个 typedef 到底是什么意思?

c - 从一个头文件构造另一个头文件

c - "srmount error"是什么意思?

PHP 位置 header 绝对路径

html - 当我滚动到表格时无法打开我的菜单

c++ - 如何 typedef 绑定(bind)成员方法,然后将该类型用作模板参数?

c - 对静态库中符号的 undefined reference