C语言中#include只能包含.h文件吗? 2024-07-31 08:40:01 文/Edward之前我们已经讲到过,#include预处理指令使另外一个文件的内容在预处理的时候,先会被复制到当前的.c文件中来,产生一个中间文件,一般情况下,这个中间文件是存储在编译器内存里面的,它不会被输出,但是我们可以使用gcc命令来将这个文件存储下来,即使用” gcc -E ./helloworld.c > a.out”命令,即可将预处理产生的内容保留出来。如图1所示。图1 预处理输出文件我们在图1中,仅仅简单地包含了一个我们自己写的一个头文件,这个头文件里面有一个#define定义的标号MAX,也有一个变量a,当我们包含了这个头文件并且进行编译的时候,编译器便会将头文件里面的内容在编译流程的预处理阶段把.c源文件中的相关标号定义全部替换掉,如果.h头文件里面包含了变量的定义,便会将变量的定义原封不动地复制到.c源文件中。以上内容就是文件包含的全部内容。然而#include预处理如果再深究下去,它的内容可不止如此。 库函数的包含和本地头文件的包含前面我们也讲到过,用#include包含头文件的时候,根据包含的头文件到底是库函数还是用户自己写的本地头文件分别有不同的包含方式。如果用#include包含库函数,那么其包含的方式为:#include <filename>对于filename不存在任何限制,不过根据约定,标准库的库文件以一个.h后缀结尾。编译器通过查找由编译器定义的“一系列标准库路径”来查找库函数的头文件。比如,在典型的UNIX/类UNIX系统上,C编译器在/user/include/目录中去查找库函数的头文件。如果是本地头文件的包含,那么其包含方式为:#include “filename”这个头文件如果和所有的源文件放置在一个目录底下,那么就无需去显式地指明其路径。如果不在同一个文件夹下,那么UNIX和BorlandC编译器都支持一种变体形式,即使用绝对地址的路径名。如:#include “../src/usart/ usart.h” 头文件的形式再来想一想,C语言中的#include只能支持包含.h后缀的头文件吗?其实不然,除了C语言标准库文件在编写时是按照约定以.h结尾的,用户自己定义的头文件根本就没有这一条规定。比如图2所示。图2 C语言包含乱七八糟后缀名的头文件在图2中大家可以看到,我在b.c这个C语言源文件里面包含了一个c.x的头文件,这个c.x后缀名我自己也不知道是什么意思。但是奇怪的是,编译器在做预处理的时候,竟然将c.x文件中的内容正常的处理过来了,除了VSCode做代码静态解析的时候,有错误提示之外,其他貌似什么事情都没有发生。因此,在一个.c文件里面用#include包含什么后缀的文件,在C语言里面没有规定。只不过约定俗成,都用.h结尾的文件来当头文件而已。但是,C语言中源文件的后缀名有明确要求,一定要用.c后缀的文件。 头文件里面的内容接下来,最后一个内容,头文件里面到底可以用来写什么内容。这个问题非常玄乎,C语言也没有规定,随便你自己去写。我之前看到过有个哥们(一个半路出家的工程师)将函数全部定义在头文件中。对于这样的人才,我除了说他天资聪颖,资质过人,骨骼精奇这样的褒义词之外,根本就词穷了。C语言的头文件里面的的确确可以用来写函数,你没有听错,我再写一遍,的的确确可以用来写函数。但是,这样子写出来的函数很难被多个其它文件包含。这个问题我本来不想展开讲解,因为杀伤力太大,我怕将这个反面教材正面化了。但是满足大家的好奇,还是贴出来了,如图3所示。图3 反面教材 赞 (0) 相关推荐 Linux Makefile 生成 *.d 依赖文件以及 gcc https://blog.csdn.net/qq1452008/article/details/50855810 1. 为什么要使用后缀名为 .d 的依赖文件? 在 Makefile 中, 目标文件的 ... linux c头文件#include<sys/types.h>和#include<fcntl.h>头文件总结 #include<sys/types.h>的介绍 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型.linux编程中经常用到的头文件. ... freeRTOSConfig.h文件对FreeRTOS进行系统配置 FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制.每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核.这个配置文件是针 ... R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据 原文链接:http://tecdat.cn/?p=5919 在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测时间序列数据. 使用滞后算子计算 ... R语言中的Wilcoxon符号秩检验与配对学生t检验 原文链接:http://tecdat.cn/?p=3172 在这篇文章中,我们将探索比较两组依赖(即配对)定量数据的检验:Wilcoxon符号秩检验和配对学生t检验.这些检验之间的关键区别在于Wilc ... 嵌入式项目中,各种包含头文件区别及利弊 好的编程习惯,会直接影响代码的质量,在嵌入式C/C++中,头文件的引用方式和方法有多种,同时一些细节也会影响你代码质量和编译效率. 下面就来说说与头文件有关的知识: 嵌入式专栏 1 引号"& ... C/C++编程笔记:C语言中while(1)和while(0)之间的区别 在大多数计算机编程语言中,while循环是一个控制流语句,该语句允许根据给定的布尔条件重复执行代码.布尔条件为true或false while(1) 这是一个无限循环,它将一直运行到显式发出break ... (7条消息) c语言中 char* 和 unsigned char* 的区别浅析 背景 最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用.这个警告很容易避免,但是char*和unsigned char*到 ... 众多语言中,为什么很多服务器都选择Nginx呢?让大佬告诉你 Nginx是一个高性能的Web和反向代理服务器,它具有有很多非常优越的特性: 作为Web服务器: 相比Apache, Nginx 使用更少的资源,支持更多的并发连接,体现更高 的效率,这点使Nginx ... r语言中mpg数据 r语言中mpg数据