C:如何从库

时间:2016-12-04 21:11:10

标签: c

我刚刚开始使用C,我不太熟悉它是如何工作的。 我有一个文件stud.h:

struct stud{};
void inc_stud_pos(){};
int get_stud_pos(){};

和stud.c:

#include "stud"

#define STUDENT_SIZE 20

struct stud{
    char stud_id[MAX_STR_LEN];
    char stud_name[MAX_STR_LEN];
    struct grade Grade[MAX_STRUCT];
    struct income Income[MAX_STRUCT];
};

int stud_location = 0;

struct stud students[STUDENT_SIZE];

void inc_stud_pos(){
    stud_location++;
}

int get_stud_pos(){
    return stud_location;
}

现在我想从另一个文件中访问stud.c中的一些函数。 让我说我想在另一个文件中使用STUDENT_SIZE的语法是什么? 我需要使用stud.STUDENT_SIZE吗?或者,当我加入“stud”时,我可以访问学生大小? 如果我想让我们说一组学生:

struct stud students[STUDENT_SIZE];

我能否像学生一样访问[5] .stud_id?

谢谢!

2 个答案:

答案 0 :(得分:2)

头文件(.h)是程序员与模块的接口。模块的用户(程序员)需要知道使用模块的任何内容都应该在那里,但是将实际的实现放在关联的.c文件中。通常,您将函数原型(例如int f(void);)放在.h文件中,将定义(例如int f(void) { return 1; })放在.c文件中。链接器将原型与定义匹配,因为函数签名匹配(名称,参数类型和返回类型)。考虑它的一种方法是将.h文件作为您与所有人共享的文件,将.c文件作为您保留给自己的文件。

如果您希望模块的用户有权访问STUDENT_SIZE,请填写

#define STUDENT_SIZE 20

在您的.h文件中,而不是.c文件中。然后,任何文件

#include "stud.h"

会为STUDENT_SIZE设置您的宏。 (请注意,文件名为"stud.h"而非"stud"。)

  

让我们说我想在另一个文件中使用STUDENT_SIZE的语法是什么?我需要使用stud.STUDENT_SIZE吗?

没有。您可能会将此与名称空间混淆,C does not have与其他语言(如C ++,Java等)的意义相同。只需使用STUDENT_SIZE即可。 (这就是为什么重要的是不使用现有的标识符,以及为什么许多人对宏不满意。)

  

...我想从另一个文件中访问stud.c中的一些函数。

如果您希望其他文件可以访问stud.c中的某个函数,请将该函数的原型放在stud.h中。这正是头文件的用途。

  

...如果我想让一群学生说:

     

struct stud students[STUDENT_SIZE];

     

我可以像students[5].stud_id那样访问吗?

在编写头文件时,没有。您可能知道某些struct stud存在,但您不知道成员被调用的内容(即您不知道stud_id存在)。原因是模块的用户只能看到头文件中的内容,并且您在头文件中没有定义结构的成员。 (我很惊讶你写的甚至是编译,因为你定义struct stud两次,一次是空{},一次是成员。)同样,如果你想让程序员用户有权访问成员struct stud的定义

struct stud {
    char stud_id[MAX_STR_LEN];
    char stud_name[MAX_STR_LEN];
    struct grade Grade[MAX_STRUCT];
    struct income Income[MAX_STRUCT];
};

属于您的头文件(以及其他任何宏)。在不知情的情况下,程序员(和编译器)不知道struct stud的成员是什么。

(您没有问过这个问题,但如果您想在.c文件中共享对全局变量的访问权限,那么声明 extern文件中的关键字.hextern文件中没有.c的关键字{{1}}。有关详情,请参阅How to correctly use the extern keyword in C

答案 1 :(得分:1)

您无法使用头文件的写入方式访问CREATE INDEX field_value_bt ON field (value(100)) 。头文件桥接并扩展了上述项目的范围:

STUDENT_SIZE

如果要扩展struct stud{}; //this should be fixed btw void inc_stud_pos(); int get_stud_pos(); 的范围,则不要在STUDENT_SIZE文件中声明它,而是将其放在.c文件中。如果您这样做,则必须删除在.h文件中声明STUDENT_SIZE的代码行。