我刚刚开始使用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?
谢谢!
答案 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
文件中的关键字.h
,extern
文件中没有.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
的代码行。