我刚开始使用C语言,我不太熟悉它的工作原理。我有一份档案研究报告
struct stud{};
void inc_stud_pos(){};
int get_stud_pos(){};
和研究人员:
#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吗?还是当我把“钉”包括在内的时候,我可以接触到学生的大小?如果我想说,做一组学生:
struct stud students[STUDENT_SIZE];
我可以访问正常情况下的students5.stud_id吗?
谢谢!
发布于 2016-12-04 21:41:09
头文件(.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++等)的含义相同,只需使用STUDENT_SIZE
即可。(这就是为什么不使用现有标识符很重要,也是为什么许多人不喜欢宏。)
..。我希望从另一个文件中访问stud.c中的一些函数。
如果您希望另一个文件能够访问stud.c
中的某个函数,那么将该函数的原型放在stud.h
中。这正是头文件的作用所在。
..。如果我想让一群学生:
struct stud students[STUDENT_SIZE];
我可以访问正常情况下的students[5].stud_id
吗?
由于您已经编写了您的头文件,没有。您可能知道有一些struct stud
存在,但是您不知道成员被称为什么(也就是说,您不会知道stud_id
存在)。原因是您的模块的用户只看到头文件中的内容,并且您在头文件中没有定义任何struct成员。(我很惊讶您所编写的编译,因为您定义了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
文件中的全局变量的访问,那么使用.h
文件中的关键字extern
来声明它,而在.c
文件中不要使用extern
。请参阅How to correctly use the extern keyword in C获取更多信息。)
发布于 2016-12-04 21:15:25
不能使用头文件的写入方式访问STUDENT_SIZE
。头文件桥接并扩展了上述项的范围:
struct stud{}; //this should be fixed btw
void inc_stud_pos();
int get_stud_pos();
如果您想扩展STUDENT_SIZE
的作用域,那么不要在.c
文件中声明它,而是将它放在.h
文件中。但是,如果这样做,则必须删除在STUDENT_SIZE
文件中声明.c
的代码行。
https://stackoverflow.com/questions/40963696
复制相似问题