GCC 报告包含的无关错误
GCC reporting unrelated errors for include
我已将新文件添加到项目中:
#ifndef PLAYER_H
#define PLAYER_H
#include "enet/enet.h" //the problem
typedef struct Player
{
ENetPeer * peer; //requires problematic include
//void * peer; //works, since no include required
} Player;
const struct Player playerEmpty;
#endif //PLAYER_H
如果 include
存在,我会在不相关的文件中得到大量 error: expected ';', ',' or ')' before numeric constant
。如果我删除 include
并改用 void * peer
,一切都很好。 enet 库包含在其他地方的源文件中,并且工作正常。我使用的是 enet 1.3.13(最新版),它的头部防护装置似乎就位。这是在 gcc 4.9.2 下。
郑重声明 错误发生在 Point.h
:
#ifndef POINT_H
#define POINT_H
#include <stdint.h>
#define X 0
#define Y 1
#define Z 2
typedef int16_t int16_Point2[2];
typedef int32_t int32_Point2[2];
typedef uint16_t uint16_Point2[2];
typedef uint32_t uint32_Point2[2];
typedef int16_t int16_Point3[3];
typedef int32_t int32_Point3[3];
typedef uint16_t uint16_Point3[3];
typedef uint32_t uint32_Point3[3];
#endif //POINT_H
我确定这很简单 - 知道我做错了什么吗?
问题是单字符 #define
s。永远不要这样做。
我已经使用 X
、Y
和 Z
几个月了,但在我今天加入 Player.h
之前从来没有遇到过问题,这一定有最后——以一种迂回的方式——在预处理器/编译器中引发了一些问题。删除这些返回的编译到(表面上的)正常。
感谢那些在评论中提供帮助的人。
使用 single-letter 宏名称通常是个好主意。它们可能很容易替换意想不到位置的字母(注意:宏实际上是实际编译阶段之前的文本替换)。
你写的错误发生在Point.h。我不认为它们实际上 发生 ,而只是在这里 报道 。众所周知,C 无法在实际位置检测到语法错误。检查包含 Point.h
的文件
注意:header 中的 const struct Player playerEmpty;
也可能是不需要的,因为这会在每个编译单元中创建一个带有外部链接的 object。这与C++不同:在C中,实际上没有常量,只有常量变量:const
只是程序员的承诺,变量一旦初始化就永远不会改变.更糟糕的是:你没有给它赋值,从而使它有效 0
- 全局变量被初始化为所有位 0。我很确定这不是故意的。
更新:
如果那是为了积分,怎么样:
typedef union __attribute__ ((__packed__)) {
struct {
int16_t x,y,z;
}; // anonymous union field (C99)
int16_t vec[3];
} int16_Point3;
...
// usage:
int16_Point3 point = (int16_Point3){ .x = 5, .y = 3 }; // compound literal
point.z = point.x + point.vec[1]; // other word for point.y
摆脱 #define
并获得正确的语法。
注意 __attribute__ ((__packed__))
是 gcc-specific 以避免在结构字段之间填充字节。即 non-standard,但其他编译器通常具有类似的功能(例如 pragma
)。结构和数组的布局必须相同。
这可能比索引更具可读性。请注意,匿名结构和联合字段 是标准的。
我已将新文件添加到项目中:
#ifndef PLAYER_H
#define PLAYER_H
#include "enet/enet.h" //the problem
typedef struct Player
{
ENetPeer * peer; //requires problematic include
//void * peer; //works, since no include required
} Player;
const struct Player playerEmpty;
#endif //PLAYER_H
如果 include
存在,我会在不相关的文件中得到大量 error: expected ';', ',' or ')' before numeric constant
。如果我删除 include
并改用 void * peer
,一切都很好。 enet 库包含在其他地方的源文件中,并且工作正常。我使用的是 enet 1.3.13(最新版),它的头部防护装置似乎就位。这是在 gcc 4.9.2 下。
郑重声明 错误发生在 Point.h
:
#ifndef POINT_H
#define POINT_H
#include <stdint.h>
#define X 0
#define Y 1
#define Z 2
typedef int16_t int16_Point2[2];
typedef int32_t int32_Point2[2];
typedef uint16_t uint16_Point2[2];
typedef uint32_t uint32_Point2[2];
typedef int16_t int16_Point3[3];
typedef int32_t int32_Point3[3];
typedef uint16_t uint16_Point3[3];
typedef uint32_t uint32_Point3[3];
#endif //POINT_H
我确定这很简单 - 知道我做错了什么吗?
问题是单字符 #define
s。永远不要这样做。
我已经使用 X
、Y
和 Z
几个月了,但在我今天加入 Player.h
之前从来没有遇到过问题,这一定有最后——以一种迂回的方式——在预处理器/编译器中引发了一些问题。删除这些返回的编译到(表面上的)正常。
感谢那些在评论中提供帮助的人。
使用 single-letter 宏名称通常是个好主意。它们可能很容易替换意想不到位置的字母(注意:宏实际上是实际编译阶段之前的文本替换)。
你写的错误发生在Point.h。我不认为它们实际上 发生 ,而只是在这里 报道 。众所周知,C 无法在实际位置检测到语法错误。检查包含 Point.h
的文件注意:header 中的 const struct Player playerEmpty;
也可能是不需要的,因为这会在每个编译单元中创建一个带有外部链接的 object。这与C++不同:在C中,实际上没有常量,只有常量变量:const
只是程序员的承诺,变量一旦初始化就永远不会改变.更糟糕的是:你没有给它赋值,从而使它有效 0
- 全局变量被初始化为所有位 0。我很确定这不是故意的。
更新:
如果那是为了积分,怎么样:
typedef union __attribute__ ((__packed__)) {
struct {
int16_t x,y,z;
}; // anonymous union field (C99)
int16_t vec[3];
} int16_Point3;
...
// usage:
int16_Point3 point = (int16_Point3){ .x = 5, .y = 3 }; // compound literal
point.z = point.x + point.vec[1]; // other word for point.y
摆脱 #define
并获得正确的语法。
注意 __attribute__ ((__packed__))
是 gcc-specific 以避免在结构字段之间填充字节。即 non-standard,但其他编译器通常具有类似的功能(例如 pragma
)。结构和数组的布局必须相同。
这可能比索引更具可读性。请注意,匿名结构和联合字段 是标准的。