C++ SDL 在"-"令牌之前出现非限定 ID

C++ SDL Expected unqualified-id before '-' token

本文关键字:ID SDL 令牌 C++      更新时间:2023-10-16

我使用过:

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 "SDLSDL.h"
#include <string>

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声明没有进行实例定义,也需要在声明之后使用分号。

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

这解决了

的问题

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

试着通过预处理器运行代码并查看预处理后的输出。对于GCC和GCC兼容的编译器,这可以通过传递-E命令行标志而不是-c来实现。例如:

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

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

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