1

我只是在做一个小编程项目,我遇到了一个相当常见的错误,即未声明的东西:

MP_HighLevelData.c:230:15: error: ‘RemovedUser’ undeclared (first use in this function)

以为我刚刚忘记声明变量,我顺着源文件中的那行,发现错误指向这行代码:

User *RemovedUser;

奇怪,我不能声明一个新变量,因为它不存在?我确定不是这行代码有问题,所以这里有一个更完整的代码片段。我真的很想知道我做错了什么。

void RemoveUserFromGameRoom(User *User) {

  if (User->GameRoom != NULL) {
    GameRoom *GameRoom = User->GameRoom;

    if (GameRoom->Owner == User) {

      // We should delete the whole game room, since the owner is leaving and a new owner isn't chosen automatically
      while (GameRoom->UsersHead != NULL) { // Awesome way of looping while there are users left in the room
        // We need to get rid of all the users in this game room, including the owner, before we can remove it
        User *RemovedUser;
        RemovedUser = GameRoom->UsersHead->User;
        DeleteUserPtrFromGameRoom(GameRoom->UsersHead); // Remove reference to the user from the game room
        RemovedUser->GameRoom = NULL; // Remove reference to the game room from the user (needs to be set afterwards, whoops)
      }

      // All the users have been kicked out, now we can take care of the game room
      FreeRIDfromGameCategory(GameRoom->RID, User->GameCategory);
      ClearGameRoomName(GameRoom);
      DeleteGameRoomFromGameCategory(GameRoom, User->GameCategory);

    } else {
      UserPtr *UserPtr = GameRoom->UsersHead;

      while (UserPtr != NULL) {
        if (UserPtr->User == User) {
          DeleteUserPtrFromGameRoom(UserPtr);
          User->GameRoom = NULL;
          break;
        }

        UserPtr = UserPtr->next;
      }
    }

  }

}
4

1 回答 1

2

通常,当面临“类型”或“类型变量”的决定时,编译将始终假定“类型变量”,这就是User作为对象访问的原因。

但是,与此同时,使用该类型声明一个新对象User无法正常工作,因为对于编译器来说,这是一个变量,而不是一个类型。

简而言之:将您的变量重命名User为除类型名称(即UserObject或其他名称)之外的任何名称,并且您的代码在这方面应该可以正常工作。

为了澄清,这是我建议的修复:

void RemoveUserFromGameRoom(User *myUser) {

    if (myUser->GameRoom != NULL) {
        GameRoom *GameRoom = myUser->GameRoom;
        //More code to come
    }
    //Some more code
 }
于 2013-02-23T08:03:03.023 回答