警告:“返回”,带有一个值,在函数中返回 void 返回下一个;例如 19.c:95:10:错误:void 值未被忽略,



我正在阅读学习代码的艰难方式书,并坚持练习 19 http://c.learncodethehardway.org/book/ex19.html。我感到绝望,复制并粘贴了代码,但仍然出现错误:

cc -Wall    -g    ex19.c object.o   -o ex19
ex19.c: In function ‘Room_move’:
ex19.c:65:5: warning: ‘return’ with a value, in function returning void
     return next;
     ^
ex19.c: In function ‘Map_move’:
ex19.c:95:10: error: void value not ignored as it ought to be
     next = location->_(move)(location, direction);
          ^
ex19.c: In function ‘Room_attack’:
ex19.c:145:5: warning: initialization from incompatible pointer type
     .move = Map_move,
     ^
ex19.c:145:5: warning: (near initialization for ‘MapProto.move’)
ex19.c:199:5: warning: ‘main’ is normally a non-static function [-Wmain]
 int main(int argc, char *argv[])
     ^
ex19.c:214:1: error: expected declaration or statement at end of input
 }
 ^
ex19.c:214:1: error: expected declaration or statement at end of input
ex19.c:214:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

这就是我得到的:

void Room_move(void *self, Direction direction)
{
    Room *room = self;
    Room *next = NULL;
    if(direction == NORTH && room->north) {
        printf("You go north, into:n");
        next = room->north;
    } else if(direction == SOUTH && room->south) {
        printf("You go south, into:n");
        next = room->south;
    } else if(direction == EAST && room->east) {
        printf("You go east, into:n");
        next = room->east;
    } else if(direction == WEST && room->west) {
        printf("You go west, into:n");
        next = room->west;
    } else {
        printf("You can't go that direction.");
        next = NULL;
    }
    if(next) {
        next->_(describe)(next);
    }
    return next;
}
void *Map_move(void *self, Direction direction)
{
    Map *map = self;
    Room *location = map->location;
    Room *next = NULL;
    next = location->_(move)(location, direction);
    if(next) {
        map->location = next;
    }
    return next;
}
int main(int argc, char *argv[])
{
    // simple way to setup the randomness
    srand(time(NULL));
    // make our map to work with
    Map *game = NEW(Map, "The Hall of the Minotaur.");
    printf("You enter the ");
    game->location->_(describe)(game->location);
    while(process_input(game)) {
    }
    return 0;
}

这一行:

void Room_move(void *self, Direction direction)

应该是:

void *Room_move(void *self, Direction direction)

您链接的页面上就是这种情况,因此您在复制/粘贴代码时搞砸了。

在为函数指定返回类型时缺少指针变量Room_move()。您需要使用

void* Room_move(void *self, Direction direction)

而不是void Room_move(void *self, Direction direction).

void* Room_move()使返回类型为 void * ,但void Room_move()本质上意味着void返回。副作用:

  1. 警告:"返回"带有值,在函数中返回 void

  2. 错误:void 值未被忽略

    ,因为它应该是

因此,如您所见,voidvoid*是不一样的。

最新更新