C ++ SDL在' - '标记之前预期的nonqualified-id

时间:2013-07-18 02:20:01

标签: c++ sdl

我用过:

typedef struct entity {
    int health;
    int damage;
    SDL_Rect hitbox;
} player, basicEnemy[10];

处理我的玩家(以及敌人)。我的问题是我得到了:

error: expected unqualified-id before '-' token

对于这一行(和一个类似的):

if( keystate[SDLK_LEFT] )  player.hitbox.x -= 1;

我该如何解决这个问题? 如果我在结构上没有typedef,则不会发生错误,但是另一个错误(这就是为什么我让它有typedef)

接头:

#include "SDL.h"
#include "SDL\SDL.h"
#include <string>

3 个答案:

答案 0 :(得分:2)

typedef定义了一个类型别名。说:

typedef struct entity {
    // ...
} player, basicEnemy[10];

你在说:

struct entity {
    // ...
};

typedef entity player;          // 'player' is an alias for 'entity'.
typedef entity basicEnemy[10];  // 'basicEnemy' is an alias for 'entity[10]'.

当你真正想要的是制作struct声明和两个实例定义时:

struct entity {
    // ...
} player, basicEnemy[10];

将它们分开可能更好,以避免这种混淆:

struct entity {
    // ...
};

entity player, basicEnemy[10];

请注意,struct声明后,即使没有实例定义,也需要使用分号。

答案 1 :(得分:1)

typedef struct entity {
    int health;
    int damage;
    SDL_Rect hitbox;
} playerType, enemyType;
playerType player;
enemyType basicEnemy[10];

解决了这个问题

答案 2 :(得分:0)

您很可能在某些包含的头文件中意外定义了一些宏(可能是hitbox?),这会导致扩展时出现语法错误。

尝试通过预处理器运行代码并查看预处理的输出。使用GCC和GCC兼容的编译器,可以通过传递-E command line flag而不是-c来完成。例如:

g++ myfile.cpp -E -o myfile.ii

.ii是预处理C ++文件的推荐文件扩展名,但不是必需的。看看那个文件,看看你收到错误的行发生了什么。

使用Visual Studio,您可以使用/P option。对于其他编译器,请查看编译器的文档,了解如何查看预处理的输出。