我正在努力学习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);
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
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);
Run Code Online (Sandbox Code Playgroud)
但是,如果我调用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);
Run Code Online (Sandbox Code Playgroud)
或者,如果我只是直接将参数传递给函数,我仍然不会得到这些错误:
switch (action) {
case 'c':
Database_create(conn, atoi(argv[3]), atoi(argv[4]));
Database_write(conn);
Run Code Online (Sandbox Code Playgroud)
任何有关为什么会发生这种情况的新手有所帮助的帮助将不胜感激!
Kei*_*son 11
一个case标签只能应用于一个声明,而不是一个声明.
一个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);
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
如果你的编译器支持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);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
但那很难看,我不推荐它.首先,添加大括号意味着声明的范围仅限于它们出现的单个分支; 随着: ;黑客,他们的范围延伸到封闭块的末端.
(在C++中,声明是语句的子集,所以你的代码是有效的.这不是直接相关的,因为你问过C - 这不是切换语言的好理由.)