2014-10-09 101 views
4

我正在尝试学习c。错误:预期表达;使用未声明的标识符

我在主要功能如下代码:

switch (action) { 
    case 'c': 

    int max_data = atoi(argv[3]); 
    int max_rows = atoi(argv[4]); 
    Database_create(conn, max_data, max_rows); 
    Database_write(conn); 

编译器会引发以下错误:

mydb.c:107:7: error: expected expression 
    int max_data = atoi(argv[3]); 
^
mydb.c:110:29: error: use of undeclared identifier 'max_data' 
    Database_create(conn, max_data, max_rows); 

但是,如果我叫printf函数,你可以在下面看到我不在编译时没有任何错误。

switch (action) { 
    case 'c': 
    printf("HELLO"); 
    int max_data = atoi(argv[3]); 
    int max_rows = atoi(argv[4]); 

    Database_create(conn, max_data, max_rows); 
    Database_write(conn); 

或者,如果我只是传递参数直奔功能我还没有得到这些错误:

switch (action) { 
    case 'c': 
    Database_create(conn, atoi(argv[3]), atoi(argv[4])); 
    Database_write(conn); 

在新手脱落一些轻的任何帮助,为什么发生这种情况会大大不胜感激!

+3

正如一个侧面说明,第一个之后总是不信任错误。大多数情况下,它们是由第一个引起的,并没有多大意义。 “使用未声明的标识符”仅仅是因为编译器在同一行中的早期声明中窒息:) – hobbs 2014-10-09 02:10:57

回答

11

一个case标签只能应用于声明,而不是一个声明

A case标签可以后面跟着多个语句(将按顺序执行),但紧接在case 'c':之后的东西必须是一个语句。

加括号将解决这个问题:

switch (action) { 
    case 'c': { 
     int max_data = atoi(argv[3]); 
     int max_rows = atoi(argv[4]); 
     Database_create(conn, max_data, max_rows); 
     Database_write(conn); 
    } 
    /* ... */ 
} 

如果你的编译器支持C99或更高版本(可进行混合声明和语句),那么你也可以通过后加入空语句解决问题案例标签:

switch (action) { 
    case 'c': ; 
     int max_data = atoi(argv[3]); 
     int max_rows = atoi(argv[4]); 
     Database_create(conn, max_data, max_rows); 
     Database_write(conn); 
    /* ... */ 
} 

但这是丑陋的,我不推荐它。首先,添加大括号意味着声明的范围仅限于它们出现的单个分支;与: ;黑客,他们的范围延伸到封闭块的结束。

(在C++中,声明是声明的一个子集,所以你的代码是有效的,这与你提到C有关,这不是直接相关的 - 这不是切换语言的好理由。)

+0

这是有道理的。我现在可以看到灯光。谢谢! – 2014-10-09 02:03:38