1

我试图从 io.h 调用 main.c 中的一个函数,该函数从文件中读取数据,将该数据存储到多个结构中,然后以某种方式让我将不同的结构作为参数传递给 main 中的后续函数。后面的函数将在其他文件中定义,例如 alg.h。

我该怎么做呢?我是否使用 extern 并使结构全局化并将它们放在单独的文件中?是否可以让 alg.h 中的函数具有其中一个结构的返回类型?这取决于我的包含顺序吗?

下面粘贴的代码符合并有效,但任何移动任何结构的尝试都会导致程序无法编译。

此外,是否可以在 alg.h 中声明一个结构,然后在 alg.h 中声明具有该结构作为参数的函数。然后在 main.c 中,初始化该结构并将其传递给在 io.h 中声明的函数,给该结构一些值,将其返回给 main.c,然后将其传递给在 alg.h 中声明的函数?我知道这听起来像一个类,但我需要一个 C 解决方案,而且我只需要一个浮动的结构实例。

谢谢。

io.h

struct s1 {
    int num1;
    double num2;
};

struct s2 {
    int num3;
    double num4;
};

void io_init(struct s1*, struct s2*);

io.c

#include <stdio.h>
#include <stdlib.h>

#include "io.h"

void io_init(struct s1* s1i, struct s2* s2i)
{
    s1i->num1 = 5;
    s1i->num2 = 2.4;

    FILE *fp;
    char line[80];

    fp = fopen("input.txt","rt");

    fgets(line, 80, fp);
    sscanf(line,"%i",&s2i->num3);
    fgets(line, 80, fp);
    sscanf(line,"%i",&s2i->num4);

    fclose(fp);
}

算法

void ga_init(struct s1);

算法

#include <stdio.h>

#include "io.h"
#include "ga.h"

void ga_init(struct s1 s1i)
{
    printf("%i", s1i.val1);
}

主.c:

#include <stdio.h>

#include "io.h"
#include "ga.h"

int main() {
    struct s1 s1i;
    struct s2 s2i;

    io_init(&s1i, &s2i);
    ga_init(s1i);

    return 0;
}
4

2 回答 2

3

每个需要声明类型(即,想要使用它们)的文件都必须包含你的头文件(好的,所以前向声明和指针可以工作,但是如果没有定义它们就不能被取消引用,无论如何这在这里并不适用.)

所以,详细地说,如果文件 X 需要使用,struct Y那么它需要包含包含其声明的头文件,就是这样。

/* X.c */
#include "Y.h"  /* <-- that's it! */

void foo(Y *obj) {
    /* ... */
}
于 2012-11-05T21:17:44.230 回答
2

这里有一些建议。

  • 您的.h文件没有定义结构对象。它只是定义类型。它的方式很好。每个接触这些类型结构的人都应该包含这个文件。

  • 很少需要像在调用ga_init. 您基本上总是希望通过引用进行调用,就像您使用io_init.

  • 是的,您可以返回一个结构,但同样,返回对结构的引用几乎总是更好。

  • extern您当然可以共享全局定义的结构,除非您的链接器很糟糕,否则您不需要。但是共享对分配的结构的引用main()大致相同。

于 2012-11-05T21:23:10.123 回答