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

珍しいことですが、別の関数内で関数を宣言することは完全に有効であり、標準です。ただし、 static 修飾子は本体のない宣言では意味がなく、別の関数内で関数を定義することはできません*。

プログラマーは関数ポインター (静的) を作成するつもりでしたか?

元のプログラマーの意図はわかりませんが、割り当てがないため、関数ポインターになることはできません。


* 実際には GCC 拡張機能として使用できます

于 2012-07-29T05:26:29.083 に答える