[英]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.