外部结构基于 aCC (HP-UX) 而不是 macOS (Xcode)

Extern struct builds on aCC (HP-UX) but not on 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];

它构建并运行良好。但是,自然地,我的程序不起作用。

我尝试按照此处的建议进行操作:

但是 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 returns on a.c and b.c: "Subscripted value is not an array, pointer, or vector" on the every line of the function inside the for 循环。

为什么 aCC 构建得很好?我认为 MIPSPro 也可以构建它(我将测试一次我 return 从旅行)

botsZ2 个匿名结构实例的数组,定义为 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};