#include用法

本文详细解释了C语言中#include指令的使用方法及其两种形式的区别。包括如何使用尖括号和双引号来指定系统头文件或用户自定义头文件的位置,并介绍了文件包含命令的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

文章目录

#include 的使用说明

>\#include叫做“文件包含”。它的功能是用来指定文件的全部内容替换程序中的命令行,从而使指定的文件与当前源文件连成一个源文件。

有如下两种形式:

#include "文件名"
#include <文件名>

文件包含这两种形式都可以使用,但是有以下几种区别:

使用尖括号:表示编译系统根据系统头文件存放的目录路径去搜索系统头文件,而不是在源文件目录去查找;
使用双引号:表示编译系统首先在当前的源文件目录中查找,若未找到才根据系统的头文件存放的目录路径去搜索系统头文件。


简而言之: 系统定义的头文件通常使用尖括号;用户自定义的头文件通常使用双引号。


以上是注意事项。
另外写一下文件包含命令的使用方法:
1、文件包含命令可以出现在文件的任何位置,但通常放置位置在文件的开头处。一条#include命令只能指定一个被包含的文件;
2、文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件;
3、当一个C程序分散在若干个文件中时,可以将多个文件公用的符号常量定义和宏定义等单独写成一个文件,然后在其他需要这些定义和说明的源文件中 用文件包含命令包含该头文件。这样可以避免在每个文件的开头都去重复书写那些共用量,也可以避免因输入或修改失误造成的不一致性。

欢迎大家留言发表自己的看法。

本文章已经生成可运行项目
#include #include struct DATA { int ID; char name[4]; char sex[3]; int score; }; void paixu(int*,DATA*,int); int sishewuru(double); void func1(int*,int*,DATA*,int*,int,int,int,int);//统计男女比例 int func2(int*,int,DATA*);//查找考生序号 void print(); void main() { int length=0,i,yiben,erben,sanben,dazhuan,male[4],female[4]; int yi,er,san,si; char input; FILE* file=fopen("f1.txt","r"),*file1; if(file==NULL) { printf("No such file!\n"); return; } while(EOF!=fscanf(file,"%*[^\n]\n")) length++;//自动计算考生数罝ATA* data=(DATA*)malloc(length*sizeof(DATA)); int* pai=(int*)malloc(length*sizeof(int)); rewind(file); for(i=0;i='0'&&input<='4')) { printf("非法输入,请重新输入\n请输入:"); fflush(stdin); } else break; } getchar(); switch(input) { case '0': printf("\n一类本科招生线:%d\n二类本科招生线:%d\三类本科招生线:%d\\n高职高专招生线:%d\n",yi,er,san,si); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取分数线.txt","w"); fprintf(file1,"一类本科招生线:%d\n二类本科招生线:%d\\n三类本科招生线:%d\n高职高专招生线:%d\n",yi,er,san,si); fclose(file1); } fflush(stdin); break; case '1': func1(male,female,data,pai,yiben,erben,sanben,dazhuan); printf("一类本科招生线男女比例:%d:%d\n",male[0],female[0]); printf("二类本科招生线男女比例:%d:%d\n",male[1],female[1]); printf("三类本科招生线男女比例:%d:%d\n",male[2],female[2]); printf("高职高专招生线招生线男女比例:%d:%d\n",male[3],female[3]); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取男女比例.txt","w"); fprintf(file1,"一类本科招生线男女比例:%d:%d\n",male[0],female[0]);
你给出的 `#include` 列表中确实存在 **重复包含** 的问题,具体是: ```c #include "mover_reg.h" ``` 这个头文件包含了 **两次**。 --- ### ❌ 为什么重复包含头文件会有问题? 虽然现代编译器和大多数标准头文件都使用了 **头文件保护(header guards)** 或 `#pragma once` 来防止重复定义,但并不是所有头文件都做了这样的保护,特别是你自己项目中的头文件。 如果一个头文件没有做保护,并且其中包含: - 函数体定义(非声明) - 全局变量定义 - 类型定义(如 `typedef struct {...} MyStruct;`) 那么就会在多个 `.c` 文件中引入多重定义错误(multiple definition),最终导致链接失败。 --- ### ✅ 解决方案 删除重复的一行即可: ```c #include "llt_support.h" #include "hidsp_init.h" #include "hidspv100_adp.h" #include "msa_com_adapter.h" #include "msa_cmd_proc_extend.h" #include "odsp_config.h" #include "odsp_para_adp.h" #include "reg_txdsp_txfir.h" #include "mover_reg.h" // 第一次出现 - 保留 #include "odsp_reg_driver.h" #include "mover_reg.h" // ❌ 第二次出现 - 删除这一行 #include "dfx_tool.h" #include "soft_version.h" #include "odsp_adda_adp.h" #include "mover_api.h" #include "temp_perf_log.h" #include "log_cmpt_adapt.c" ``` --- ### 🛡️ 如何避免重复包含? #### 方法一:使用头文件保护(Header Guards) 在每个 `.h` 文件中添加: ```c #ifndef MOVER_REG_H #define MOVER_REG_H // 头文件内容 #endif // MOVER_REG_H ``` #### 方法二:使用 `#pragma once` ```c #pragma once // 头文件内容 ``` > ⚠️ 注意:`#pragma once` 并不是 C/C++ 标准,但在大多数现代编译器中都支持(MSVC、GCC、Clang 等)。 --- ### ⚠️ 特别注意:不要 `#include .c` 文件! 你最后一行是: ```c #include "log_cmpt_adapt.c" ``` 这是非常不推荐的做法。`.c` 文件应该是单独编译的源文件,不应该被 `#include` 到其他 `.c` 文件中。否则会导致函数重复定义等问题。 > ✅ 正确做法:将 `log_cmpt_adapt.c` 添加到你的构建系统(如 CMakeLists.txt),而不是用 `#include` 包含进来。 --- ### ✅ 总结修复建议 1. 删除重复的 `#include "mover_reg.h"` 2. 确保所有头文件都有 `#ifndef/#define` 或 `#pragma once` 3. 不要 `#include .c` 文件,应该将其加入构建流程 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子,相反皆相成

感谢您的鼓励和支持❥(^_-)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值