繁体   English   中英

错误:预期表达; 使用未声明的标识符

[英]error: expected expression; use of undeclared identifier

我正在努力学习c。

我在main函数中有以下代码:

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);

任何有关为什么会发生这种情况的新手有所帮助的帮助将不胜感激!

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

case标签后面可以跟多个语句(将按顺序执行),但是紧跟在case 'c':的事情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或更高版本(允许混合声明和语句),那么你也可以通过在case标签后添加一个null语句来解决这个问题:

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);
    /* ... */
}

但那很难看,我不推荐它。 首先,添加大括号意味着声明的范围仅限于它们出现的单个分支; : ; hack,它们的范围延伸到封闭块的末尾。

(在C ++中,声明是语句的子集,所以你的代码是有效的。这不是直接相关的,因为你问过C - 这不是切换语言的好理由。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM