【问题标题】:How to use in main.c a structure defined in another .c file?如何在 main.c 中使用另一个 .c 文件中定义的结构?
【发布时间】:2016-02-09 23:49:16
【问题描述】:

我在头文件中声明了一个结构体,我们以这个为例:

//file.h
#ifndef FILE_H_INCLUDED
#define FILE_H_INCLUDED

typedef struct {
    int x;
    int y;
} Point;

#endif // FILE_H_INCLUDED

然后我在另一个文件中定义了该结构,其中包含我将在 main.c 上使用的函数原型:

//functions.c
#include "file.h"

Point p = {{1},{2}};

现在我的问题是,如何在 main.c 上使用该结构?想做类似的事情:

//main.c
#include "file.h"

printf("Point x: %d", p.x);

现在,我真正的结构有 8 个字段,它是一个包含 40 个元素的数组,所以它是 40 行代码,我不想把它放在 main.c 中,因为我希望它尽可能清晰。我不能使用全局变量。

【问题讨论】:

  • 看起来您已经在使用全局变量p
  • 那么定义应该是什么?
  • 如果它在另一个文件中并且它不是全局的,那么它不能在该文件之外直接访问。所以你的两个要求似乎是矛盾的。您可以在function.c 中定义一个函数,该函数返回p 或指向p 的指针(如果可以接受)。
  • @kaylum 你的意思是我应该把结构体的所有定义都放在一个函数里面,例如:Point initializeStruct (Point p)?
  • 不知道。因为您陈述的要求不清楚。您清楚地告诉我们要求是什么,然后我们才能提供答案。

标签: c file structure


【解决方案1】:

试试这个:

// file.h
typedef struct {
    int x;
    int y;
} Point;
void setup_point(Point *);

// functions.c
#include "file.h"
void setup_point(Point * p) {
    p->x = 1;
    p->y = 2;
}

// main.c
#include "file.h"
int main() {
    Point p;
    setup_point(&p);
    printf("Point x: %d", p.x);
}

这是理想的,因为结构的逻辑包含在单独的文件中,并且不使用全局变量。

【讨论】:

    【解决方案2】:

    创建一个返回p地址的函数。

     //file.h
     Point *Point_p(void);
    
    //functions.c
    #include "file.h"
    static Point p = {{1},{2}};
    Point *Point_p(void) { return &p; }
    
    //main.c
    #include "file.h"
    printf("Point x: %d", Point_p()->x);
    

    【讨论】:

    • 我同意这是回答问题的最直接的方式,但它并不理想,因为它鼓励使用全局变量。
    • @Massey101 全局变量在哪里? p 是静态的,仅对 functions.c 是本地的,不涉及其他变量。
    猜你喜欢
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多