编译器GCC报错 error: invalid storage class for function

编译器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语句的括号没有闭合,导致编译器发出这样的尖叫。

通过这个例子我们来解释下报错的含义

  1. C语言允许使用static来修饰变量和函数,但是,C语言不允许函数定义的嵌套!
  2. static关键字表示被修饰的符号或者说变量的存储类型,修饰变量一般表示在进程的数据段内,这部分数据有严格的作用域限制,但生命周期是整个程序。
  3. 函数的放在内存的哪里呢?当然是代码段,这部分内容是不可变的

有了这三点,我们就能判断,这个问题表示m函数应该放在代码段,却放错在了数据段

../dlib-19.22/dlib/all/../bigint/../vectorstream/vectorstream.h:31:34: error: invalid use of dependent type ‘dlib::vectorstream::vector_streambuf<CharType>::size_type’ size_type read_pos = 0; // buffer[read_pos] == next byte to read from buffer ^ In file included from ../dlib-19.22/dlib/all/../svm/../global_optimization.h:8:0, from ../dlib-19.22/dlib/all/../svm/auto.cpp:7, from ../dlib-19.22/dlib/all/source.cpp:87: ../dlib-19.22/dlib/all/../svm/../global_optimization/find_max_global.h:284:47: error: default argument missing for parameter 8 of ‘template<class funct, class ... Args> std::pair<long unsigned int, dlib::function_evaluation> dlib::impl::find_max_global(double, dlib::thread_pool&, std::vector<_RealType>&, std::vector<dlib::function_spec>, std::chrono::nanoseconds, dlib::max_function_calls, double, Args&& ...)’ std::pair<size_t,function_evaluation> find_max_global ( ^ ../dlib-19.22/dlib/all/../svm/../global_optimization/find_max_global.h:303:47: error: default argument missing for parameter 7 of ‘template<class funct, class ... Args> std::pair<long unsigned int, dlib::function_evaluation> dlib::impl::find_max_global(double, dlib::thread_pool&, std::vector<_RealType>&, std::vector<dlib::function_spec>, std::chrono::nanoseconds, double, Args&& ...)’ std::pair<size_t,function_evaluation> find_max_global ( ^ make[3]: *** [../dlib-19.22/dlib/all/libRNA_concentrations_la-source.lo] Error 1 make[3]: Leaving directory `/storage/denghua/anaconda3/lib/python3.8/site-packages/ViennaRNA-2.5.0/src/ViennaRNA' make[2]: *** [install-recursive] Error 1 make[2]: Leaving directory `/storage/denghua/anaconda3/lib/python3.8/site-packages/ViennaRNA-2.5.0/src/ViennaRNA' make[1]: *** [install-recursive] Error 1 make[1]: Leaving directory `/storage/denghua/anaconda3/lib/python3.8/site-packages/ViennaRNA-2.5.0/src' make: *** [install-recursive] Error 1
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值