混淆在C静态函数指针(Confusion about static function pointer

2019-09-20 09:59发布

看看下面的代码片段。 这是写于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包这里

Answer 1:

虽然少见,它是完全有效的,标准的声明中另一个的功能。 然而static修饰符使得在声明中没有意义没有身体,你不能*定义另一个函数内部功能。

难道程序员打算写一个函数指针(静态)?

我不知道原来的程序员的意图,但绝不可以在是一个函数指针,因为没有分配给它。


*其实你可以作为一个GCC扩展



Answer 2:

我面临着同样的问题作为错误信息不断说法是:

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

下面的错误了“功能无效的存储类”。

所以..只是保持一个手表上的括号也许可以解决此问题。



Answer 3:

至少对GCC它会给了“功能无效的存储类”,如果有一个破碎的声明中包含的文件。 你可能想回到你的头文件和寻找什么意图的声明,而是一个挂功能,比如在包含xxx.h文件:

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

在打开的“{”真的混淆GCC和将抛出随机误差后者。 这是真正的容易做到的一个功能的副本,过去,忘记更换{用;
特别是,如果你用我的心爱1TBS



文章来源: Confusion about static function pointer in c