2014-10-09 59 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

相關問題