簡體   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