Extern结构构建在aCC(HP-UX)上,但不构建在macOS(Xcode)上



我有以下头文件,我在两个源文件中共享:

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文件中定义所需的structtypedef
  • 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};

最新更新