编译器GCC报错 error: invalid storage class for function
相信刚开始使用GCC编译C语言的同学都会碰到这个问题,这是什么意思呢?
字面意义为:报错:函数有无效的存储类型
看起来也不是很直观,我们模拟一个报错出来:
int f (int a){
if (a != 0){
return a;
return a + 1;
}
static int m (int b){
return b;
}
int main (void){
return f(100);
}
demo.c: In function ‘f’:
demo.c:8:12: error: invalid storage class for function ‘m’
8 | static int m (int b){
| ^
demo.c:14:1: error: expected declaration or statement at end of input
14 | }
| ^
怎么会这样?其实细心的同学已经看到了,我们在函数f
中,if语句的括号没有闭合
,导致编译器发出这样的尖叫。
通过这个例子我们来解释下报错的含义
- C语言允许使用static来修饰变量和函数,但是,C语言
不允许函数定义的嵌套
! - static关键字表示被修饰的符号或者说变量的存储类型,修饰变量一般表示在进程的
数据段
内,这部分数据有严格的作用域限制,但生命周期是整个程序。 - 函数的放在内存的哪里呢?当然是
代码段
,这部分内容是不可变的
有了这三点,我们就能判断,这个问题表示m
函数应该放在代码段
,却放错在了数据段
。