6

看下面的代码片段。它是在 2005 年编写的,但我正在用最新的 gcc 编译它。

xln_merge_nodes_without_lindo(coeff, cand_node_array, match1_array, match2_array)
  sm_matrix *coeff;
  array_t *cand_node_array, *match1_array, *match2_array;
{ 
  node_t *n1, *n2;
  sm_row *row1, *row2;
  static sm_row *xln_merge_find_neighbor_of_row1_with_minimum_neighbors();

  while (TRUE) {
      row1 = sm_shortest_row(coeff);
      if (row1 == NIL (sm_row)) return;
      n1 = array_fetch(node_t *, cand_node_array, row1->row_num);
      row2 = xln_merge_find_neighbor_of_row1_with_minimum_neighbors(row1, coeff);
      n2 = array_fetch(node_t *, cand_node_array, row2->row_num);
      array_insert_last(node_t *, match1_array, n1);
      array_insert_last(node_t *, match2_array, n2);
      xln_merge_update_neighbor_info(coeff, row1, row2);
  }
}

编译时,它抱怨,

xln_merge.c:299:18: error: invalid storage class for function ‘xln_merge_find_neighbor_of_row1_with_minimum_neighbors’

(xln_merger.c:299 是定义开始后的第 3 行)。

第 3 行函数定义似乎是一个函数声明(不是吗???)。程序员是否打算编写函数指针(静态)?或者随着时间的推移,c 中的某些语法发生了变化,为什么它没有编译。

这段代码来自这里sis的包

4

3 回答 3

12

至少对于 GCC,如果包含文件中存在损坏的声明,它将给出“函数的无效存储类”。你可能想回到你的头文件并寻找本来应该是一个声明的东西,而不是一个挂起的函数,比如在包含的 xxx.h 文件中:

void foo(int stuff){       <<<<<<<<< this is the problem, replace { with ;
void bar(uint other stuff);

开放的“{”确实让 GCC 感到困惑,并且会在后面抛出随机错误。复制和粘贴函数并忘记将 { 替换为 ; 真的很容易。
特别是,如果你使用我心爱的 1TBS

于 2015-07-06T21:58:10.720 回答
9

我遇到了同样的问题,因为错误消息不断说:

libvlc.c:507:11: warning: “/*” within comment
libvlc.c:2154: error: invalid storage class for function ‘AddIntfInternal’
libvlc.c:2214: error: invalid storage class for function ‘SetLanguage’
libvlc.c:2281: error: invalid storage class for function ‘GetFilenames’
libvlc.c:2331: error: invalid storage class for function ‘Help’
libvlc.c:2363: error: invalid storage class for function ‘Usage’
libvlc.c:2647: error: invalid storage class for function ‘ListModules’
libvlc.c:2694: error: invalid storage class for function ‘Version’
libvlc.c:2773: error: invalid storage class for function ‘ConsoleWidth’
libvlc.c:2808: error: invalid storage class for function ‘VerboseCallback’
libvlc.c:2824: error: invalid storage class for function ‘InitDeviceValues’
libvlc.c:2910: error: expected declaration or statement at end of input

解决此问题的简单方法是“我从中得到这些错误的文件中缺少一些大括号”。

只需通过以下示例。

例如:

#include<stdio.h>
int test1()
{
    int a = 2;
    if ( a == 10)
    {
    }

会给

test.c:7: error: expected declaration or statement at end of input

在“函数的无效存储类”错误之后。

所以.. 只需注意大括号就可以解决这个错误。

于 2015-08-08T06:15:12.260 回答
2

虽然不常见,但在另一个函数中声明一个函数是完全有效和标准的。但是,静态修饰符在没有主体的声明中没有意义,并且您不能*在另一个函数中定义您的函数。

程序员是否打算编写函数指针(静态)?

我不知道原始程序员的意图,但绝不可能是函数指针,因为它没有赋值。


* 实际上你可以作为 GCC 扩展

于 2012-07-29T05:26:29.083 回答