c 语言如何定义头文件,关于C/C++,分文件编写程序,类外定义,头文件到底该怎么加...

C和C++中,对象在使用前必须声明,这才是为什么我们要将声明(.h)和定义(.c/.cpp)分开的原因:在需要使用该对象的地方只需要include声明就可以了。

那么,main.c中你只要 include stu.h 就好了,不应该再 include stu.c。  甚至根据前述原则,所有.c .cpp这样的包含实现代码的文件都不应该被include。  所以这里你写错了。

另一点,挑一个用词错误(也许意味着你对此的理解也有误): stu.h 不应该叫“类声明”,stu.h的内容实际上是“类定义”——这个“定义”二字并不是指定义了一个Student对象,而是指对Student这个class类型的定义,即定义了这个class的名字以及行为。

相应的,stu.c中的内容叫“类实现”,即实现了Student class所定义的成员。

真正的类声明语句是这样的 class Student;  没错,就这么简单,就是个类名。这声明告诉编译器Student是个class类型,但编译器还是不知道这个Student类型可以做什么(因为不知道其类定义)。所以声明过后,这个类型只能用于定义Student类型的指针或引用。 要想直接使用一个class的对象,就必须要知道类定义,也就是要include stu.h。

至于你问的“为什么类定义文件里没有包含iostream”。不知道你是否明白include到底做了什么,我先说说这个:

#开头的都是预处理指示,代码在编译前先由预处理器进行处理。#include 这个指示其实就是让预处理器将被include文件的内容写到代码的那个位置上。

以main.c为例,处理过后 main.c 前的三条include就分别替换成了stu.h iostream stu.c的内容,也就是说main.c代码的开头先是stu的类定义,随后是iostream库的声明(于是后面代码中就可以用std::cout之类了),后面是stu的类实现。  看到了吗? Student的类实现(也就是你说的“类定义”)出现在了iostream声明之后,所以类实现中出现的那些cout是可以正常编译的。 当然可以正常编译的只限这个main.c文件。  如果你去编译stu.c就会发现无法通过,那就是因为stu.c中没有iostream的声明。

而你问的“为什么stu.h中不用#include”,额,代码中不是已经include了吗...

所以你是没有正确使用头文件。头文件中只应包含声明(类定义),就是为了将声明和实现分开,以方便其他代码使用这个声明(include头文件即可)。 一般来说应该这样做:

因为要想在代码中使用某class,就必须知道其类定义,所以会将类定义单独放入.h文件。像stu.h这样写就没错。stu.h的类定义中使用了std::string,所以需要在stu.h中包含string头文件。

而类实现文件stu.c中必须首先include stu.h,同时也要包含其他编译所需的必要文件。比如stu.c的代码中使用了std::cout,所以要在stu.c中包含iostream。

而main.c这样的代码是要使用Student类的,所以需要得知其类定义,那么只要include stu.h 就可以了。  是的,使用某类只需知道类定义即可,不需要知道类实现。

main.c 和 stu.c 被单独编译,然后链接到一起生成可执行文件。 这里你也能看出“编译”和“链接”做了不同的工作,代码经过编译链接才可生成可执行文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值