2

Cアプリケーションのコンパイルに問題があります。表示されるエラーは無意味です。どこから解決策を探し始めるのかわかりません。

コードは次のとおりです。

static char* FilterCreate(
    void* arg,
    const char* const* key_array, const size_t* key_length_array,
    int num_keys,
    size_t* filter_length) {
  *filter_length = 4;
  char* result = malloc(4); // error: error C2143: syntax error : missing ';' before 'type' C:\Projects\myleveldb\db\c_test.c
  memcpy(result, "fake", 4);
  return result;
}

フルスクリーンのスクリーンショットは次のとおりです スクリーンショット

そのようなエラーの原因は何ですか?

4

1 に答える 1

29

C89/90コンパイラを使用してCコードをコンパイルしています。

従来のC(C89 / 90)では、ブロックの途中で変数を宣言することは違法です。すべての変数は、ブロックの先頭で宣言する必要があります。

のようなステートメントを書き始めると、宣言*filter_length = 4が完了したことを意味します。このブロックに変数宣言を導入することはできなくなりました。宣言を上に移動すると、コードがコンパイルされます。


C言語では、宣言はステートメントではありません(宣言単なるステートメントの形式であるC ++とは対照的です)。また、C89 / 90では、複合ステートメントの文法は次のとおりです。

compound-statement:
  { declaration-list[opt] statement-list[opt] }

つまり、すべての宣言は、ブロックの最初に最初に来る必要があります。

C99では、宣言もステートメントではないことに注意してください。ただし、複合ステートメントの文法は次のように変更されています。

compound-statement:
  { block-item-list[opt] }

block-item-list:
  block-item
  block-item-list block-item

block-item:
  declaration
  statement

これが、C99で宣言とステートメントをインターリーブできる理由です。

于 2012-07-26T17:45:14.567 に答える