c 语言头文件和源文件

总结:

头文件和源程序h结尾的就是头文件,c结尾的就是源文件

把定义和实现分开,就可以通过头文件和源程序分开

在头文件中去定义,在源文件中去实现,然后main方法包含的时候只要包含头文件就可以了。



0:实际项目当中可能由成千上万个源文件,大型项目中会按照不同饿模块氛围多个源文件,例如由客户,订单,商品,购物车等模块,那么就可以按照这些某块定义不同的源文件

讲程序按照模块定义在不同的源文件中,随之而来的问题是,不同文件之间如何共享函数和全局变量。


这里就有了头文件和源文件的划分了。

我们将需要共享的函数,外部变量和一些宏定义声明头文件中,头文件一般以h结尾,
定义(其实就是实现)写在源文件中,源文件一般以c结尾的文件。
当不同源文件之间需要共享函数或者变量是偶,可以通过#include 包含指令包含头文件即可


1: 创建头文件的步骤:

定义(其实就是实现)写在源文件中,源文件一般以c结尾的文件。

当不同源文件之间需要共享函数或者变量是偶,可以通过#include 包含指令包含头文件即可



1: 创建头文件的步骤:

点击File->New->File..选择Header File->取名为Global

然后默认的:防止重复包含的

#ifndef Global_h

#define Global_h

#endif /* Global_h */



2: 创建源文件的步骤:

点击File->New->File..选择C File->取名为Global


3: 如果有一个变量在两个头文件中都进行了宏定义了,那么会采用后来的哪个的值


head1.h:


#ifndef head1_h
#define head1_h

#define TRUE 1
#define FALSE 0

#endif /* head1_h */

head2.h

#ifndef head2_h
#define head2_h

#define TRUE 2
#define FALSE 0

#endif /* head2_h */

main.c


#include <stdio.h>

#include "head2.h"
#include "head1.h"

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    printf("TRUE=%d\n",TRUE);
    return 0;
}


运行结果:
Hello, World!
TRUE=1
Program ended with exit code: 0



4: 这里需要强调的是声明,例如int a;在前面我们并没有区分声明合定哦,其实变量的声明合定义是截然不同的。

变量的声明并不分配内存空间,而定义是要分配内存空间。

要想实现声明,我们要用到另外一个关键字extern,该关键字表明只声明变量,变量的定义可能在其他的源文件中。

例如 extern int a;



5: 头文件的嵌套,头文件中可以包含其他的头文件,看看stdio.h里面其实也包含了其他的头文件


6: 构建一个购物商城:
其实就是简单一点,在h文件中申明,在c文件中定义实现,然后在main中只要倒入h文件就可以了,然后就可以直接使用了

只放一个例子:

global.h

//
//  global.h
//  Market
//
//  Created by 千 on 16/7/24.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#ifndef global_h
#define global_h

typedef struct{
    int cid;
    char name[20];
    int age;
} Customer;

typedef struct{
    int oid;
    char name[20];
} Order;



#endif /* global_h */

创建Customer.c的文件,其实创建的时候就帮忙把h文件创建好了

Customer.h

//
//  Customer.h
//  Market
//
//  Created by 千 on 16/7/24.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#ifndef Customer_h
#define Customer_h

#include <stdio.h>

void buy();
void clogin();

#endif /* Customer_h */

Customer.c

//
//  Customer.c
//  Market
//
//  Created by 千 on 16/7/24.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#include "Customer.h"


void buy(){
    printf("客户购买了\n");
}
void clogin(){
    printf("登陆了\n");
}


main.c
//
//  main.c
//  Market
//
//  Created by 千 on 16/7/24.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#include <stdio.h>
//商品 Product
//客户 Customer
//订单 Order
//购物车 ShoppingCart

#include "Customer.h"
#include "Product.h"
#include "Order.h"
#include "Cart.h"

#include "global.h"

int main(int argc, const char * argv[]) {
    // insert code here...
    productIn();
    productOut();
    
    clogin();
    buy();
    
    add();
    del();
    
    js();
    del();
    
    Customer c;
    c.cid = 1001;
    strcpy(c.name,"tom");
    c.age=20;
    
    
    
    return 0;
}




<think>好的,我现在需要回答用户关于C/C++中头文件源文件的作用及区别的问题。首先,我得回顾一下已有的知识,确保自己理解正确。根据用户提供的引用资料,头文件(.h)源文件(.cpp)在C++中有不同的角色。头文件通常包含声明,比如函数原型、类定义、宏定义等,而源文件则包含具体的实现。 接下来,我需要整理这些信息,结构清晰地呈现给用户。可能需要分点说明作用区别。例如,头文件的作用包括声明接口、包含其他头文件、使用预处理指令防止重复包含等。源文件则负责实现头文件中声明的函数类,以及包含main函数。 然后,要注意引用用户提供的资料中的内容,比如引用[1]、[2]、[3]、[4]中的内容,确保在适当的地方添加引用标识。例如,当提到头文件的作用时,可以引用[3]中的内容,提到include guard时引用[4]中的示例。 另外,需要检查是否有遗漏的信息,比如头文件源文件在编译过程中的处理方式。根据引用[1],编译过程可能涉及多个步骤,头文件的内容会被包含到源文件中,所以预处理阶段会处理这些包含关系。这可能也是区别的一部分,源文件会被编译成目标文件,而头文件不会被单独编译。 还需要注意用户提到的格式要求,比如数学表达式用$...$,但这个问题可能不涉及数学公式,所以可能不需要使用。但如果有涉及,比如提到某些代码中的变量,可能需要用正确的格式。 最后,生成相关问题的时候,要确保问题与主题相关,并且能够帮助用户进一步理解。例如,关于include guard的作用、如何组织多文件项目、头文件可能引起的问题等。 现在需要组织语言,确保回答符合结构要求:先概述,再分点说明作用区别,可能用编号或项目符号,然后添加相关问题。同时要自然插入引用标识,避免显得生硬。比如在提到头文件作用时,末尾加上[^3],或者在提到include guard时引用[^4]。 可能还需要举例子,比如头文件中声明函数,源文件中实现,这样更具体。同时注意代码示例的正确格式,用反引号包裹,并指定语言,比如```c++。 总结步骤: 1. 概述头文件源文件的基本概念。 2. 分点说明头文件的作用。 3. 分点说明源文件的作用。 4. 列出两者的主要区别,可能以表格或分点形式。 5. 插入代码示例说明如何编写头文件源文件。 6. 添加相关问题。 需要确保每个部分的信息准确,引用正确来源,并且语言简洁明了,符合用户要求的“结构清晰,帮助用户逐步解决问题”。</think>### C/C++中头文件源文件的作用及区别 #### 一、基本概念 在C/C++项目中,**头文件**(扩展名为`.h`或`.hpp`)**源文件**(扩展名为`.c`或`.cpp`)是代码组织的核心单元。 - **头文件**:包含接口声明(如函数原型、类定义、宏定义等),供其他文件引用[^3]。 - **源文件**:包含函数、类的具体实现程序入口(如`main`函数)[^1]。 --- #### 二、头文件的作用 1. **声明接口** 提供函数、类、全局变量等的声明,便于多文件共享。例如: ```c++ // math_utils.h #ifndef MATH_UTILS_H #define MATH_UTILS_H int add(int a, int b); // 函数声明 #endif ``` [^4] 2. **包含其他依赖** 通过`#include`引入其他头文件(如标准库或第三方库)[^3]。 3. **防止重复包含** 使用`#ifndef`、`#define`、`#endif`(即**include guard**)避免多次编译同一头文件[^4]。 --- #### 三、源文件的作用 1. **实现功能逻辑** 具体实现头文件中声明的函数或类: ```c++ // math_utils.cpp #include "math_utils.h" int add(int a, int b) { // 函数实现 return a + b; } ``` 2. **编译生成目标文件** 源文件是编译器直接处理的单元,会生成`.o`或`.obj`文件[^1]。 3. **程序入口** 包含`main`函数,作为程序执行的起点。 --- #### 四、主要区别 | **特征** | **头文件** | **源文件** | |-------------------|-----------------------------------|---------------------------------| | **扩展名** | `.h`, `.hpp` | `.c`, `.cpp` | | **内容类型** | 声明(接口) | 定义(实现) | | **编译处理** | 预处理阶段被包含,不单独编译 | 单独编译为目标文件 | | **重复包含问题** | 需通过include guard解决[^4] | 无需处理 | | **依赖关系** | 被多个源文件引用 | 可能依赖多个头文件 | --- #### 五、协作流程示例 1. **头文件声明函数**: ```c++ // utils.h #ifndef UTILS_H #define UTILS_H void print_message(const char* msg); #endif ``` 2. **源文件实现函数**: ```c++ // utils.cpp #include "utils.h" #include <iostream> void print_message(const char* msg) { std::cout << msg << std::endl; } ``` 3. **主程序调用**: ```c++ // main.cpp #include "utils.h" int main() { print_message("Hello, World!"); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值