C中的错误消息

时间:2012-07-26 17:42:32

标签: c visual-studio-2010

我在编译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;
}

Here是全屏截图: Screenshot

可能导致此类错误的原因是什么?

1 个答案:

答案 0 :(得分: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中交错声明和语句。