我有以下头文件,我在两个源文件中共享:
sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
我在两个源文件中使用相同的方式:a.c:
#include "sth.h"
void makeBalls(void) {
int i;
srand(time(NULL));
for (i=1;i<NBALLS;i++) {
balls[i].px = MIN + randf()*(MAX-MIN);
balls[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
balls[i].pz = MIN + randf()*(MAX-MIN);
balls[i].vx = -1.5+randf()*3.0;
balls[i].vy = -1.5+randf()*3.0;
balls[i].vz = -1.0+randf()*2.0;
}
}
和b.c:
#include "sth.h"
void makeBots(void) {
int i;
srand(time(NULL));
for (i=1;i<NBOTS;i++) {
bots[i].px = MIN + randf()*(MAX-MIN);
bots[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
bots[i].pz = MIN + randf()*(MAX-MIN);
bots[i].vx = -1.5+randf()*3.0;
bots[i].vy = -1.5+randf()*3.0;
bots[i].vz = -1.0+randf()*2.0;
}
}
在HP-UX中,它构建和运行良好。在最新的macOS中,它抱怨符号重复。
如果我在sth.h中进行以下更改:
static struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
static struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
它构建和运行良好。然而,很自然,我的程序不起作用。
我试着遵循这里的建议:在头文件中声明外部结构模板以在c文件中全局使用
但随后Xcode抱怨
bots[i].px = MIN + randf()*(MAX-MIN);
不是矢量或指针。
我很困惑为什么它能在HP-UX下工作。我正在学习C(非常初级(,并试图确保我的代码保持可移植性,同时也在学习如何处理端序问题。
谢谢,一如既往。
编辑:我根据建议做出的改变,回应了以下评论:sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}ballsZ[NBALLS];
extern struct botsZ bots;
extern struct ballsZ balls;
Xcode在a.c和b.c上返回:";订阅的值不是数组、指针或向量";在for循环内函数的每一行上。
为什么aCC构建得很好?我认为MIPSPro也可以构建它(我会在旅行回来后进行测试(
botsZ
是匿名结构的2
实例的数组,定义为htis:
struct {
float px, py, pz, vx, vy, vz;
};
这是这个数组的定义,在头文件中:
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
以下
extern struct botsZ bots;
声明了一个名为bots
、类型为struct botsZ
的外部变量,但没有此类类型。botsZ
就是一个实例。
建议:
- 在
.h
文件中定义所需的struct
和typedef
extern
声明实例- 在
.c
文件中定义实例
示例:
sth.h
#ifndef STH_H
#define STH_H
#define NBALLS 10
#define NBOTS 2
typedef struct {
float px, py, pz, vx, vy, vz;
} botsZ;
typedef struct {
float px, py, pz, vx, vy, vz;
} ballsZ;
extern botsZ bots[NBOTS];
extern ballsZ balls[NBALLS];
#endif
sth.c
#include "std.h"
botsZ bots[NBOTS] = {0};
ballsZ balls[NBALLS] = {0};