C语言编译报错error: variably modified ‘***’ at file scope

博客介绍了C语言中const并非真正的常量,只是只读,使用const声明的对象是运行时对象,有使用限制。还给出解决办法,即使用宏定义#define代替const,并说明了#define和const的不同,如const修饰的类型占内存,#define不占,只是编译前做字符串替换。

C语言编译报错error: variably modified ‘***’ at file scope


报错原因
在数组声明中使用了只读类型。
造成此报错的原因是由于使用了类似一下的代码

const int length = 256;
char buffer[length] = {0};

在C语言中,const不是一个真真正正的常量,其代表的含义仅仅是只读。使用const声明的对象是一个运行时对象,无法使用其作为某个量的初值、数组的长度、case的值或在类型的情形中使用。例如

//注释中为报错信息
const int length = 256;
char buzzer[length];        //error: variably modified ‘buffer’ at file scope
int i = length;             //error: initializer element is not constant

switch (x) {
case length:            //error: case label does not reduce to an integer constant
	/* code */
	 break;
default:
	 break;
}

解决方法
使用宏定义#define代替只读类型const例如

//解决报错
#define LENGTH 256
char buzzer[LENGTH];        //error: variably modified ‘buffer’ at file scope
int i = LENGTH;             //error: initializer element is not constant

switch (x) {
case length:            //error: case label does not reduce to an integer constant
	/* code */
	 break;
default:
	 break;

#define和const的不同
由const修饰的类型在内存中占空间而#define不占空间,#define只是在编译前将要编译的源文件中相应的部分使用字符串替换例如前面的代码在编译前会被预处理为

char buzzer[256];       
int i = 256;            

switch (x) {
case 256:           
	/* code */
	 break;
default:
	 break;

详细参考:https://blog.youkuaiyun.com/mad_sword/article/details/79809263

[ 12%] Building C object CMakeFiles/mstp.dir/adAppMstp.c.o In file included from data/dataMstpUtil.c:40:0: data/dataMstp.h:102:23: error: variably modified 'vlanMap' at file scope UINT8 vlanMap[VLAN8021Q_VID_MAX + 1]; /* VLAN 映射 */ ^ CMakeFiles/mstp.dir/build.make:65: recipe for target 'CMakeFiles/mstp.dir/data/dataMstpUtil.c.o' failed make[4]: *** [CMakeFiles/mstp.dir/data/dataMstpUtil.c.o] Error 1 make[4]: *** Waiting for unfinished jobs.... In file included from data/ucMstp.h:26:0, from data/ucMstp.c:35: data/dataMstp.h:102:23: error: variably modified 'vlanMap' at file scope UINT8 vlanMap[VLAN8021Q_VID_MAX + 1]; /* VLAN 映射 */ ^ CMakeFiles/mstp.dir/build.make:91: recipe for target 'CMakeFiles/mstp.dir/data/ucMstp.c.o' failed make[4]: *** [CMakeFiles/mstp.dir/data/ucMstp.c.o] Error 1 In file included from data/../include/mstpRtn.h:26:0, from data/rtdMstp.c:35: ./data/dataMstp.h:102:23: error: variably modified 'vlanMap' at file scope UINT8 vlanMap[VLAN8021Q_VID_MAX + 1]; /* VLAN 映射 */ ^ CMakeFiles/mstp.dir/build.make:78: recipe for target 'CMakeFiles/mstp.dir/data/rtdMstp.c.o' failed make[4]: *** [CMakeFiles/mstp.dir/data/rtdMstp.c.o] Error 1 CMakeFiles/Makefile2:78: recipe for target 'CMakeFiles/mstp.dir/all' failed make[3]: *** [CMakeFiles/mstp.dir/all] Error 2 Makefile:132: recipe for target 'all' failed make[2]: *** [all] Error 2 package/tplink/tplink-generic.mk:289: recipe for target '/project/code/fep_source/buildroot/build/arm/build/tplink/mstp-1.0/.stamp_built' failed make[1]: *** [/project/code/fep_source/buildroot/build/arm/build/tplink/mstp-1.0/.stamp_built] Error 2 Makefile:84: recipe for target '_all' failed make: *** [_all] Error 2 ✘ ⚡ root@localhost  /project/code/fep_source/buildroot  ↱ bugfix1 ± 
最新发布
08-27
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值