C语言#include还有些你不知道的事

#include简介

在C语言中#include是preprocessor的一条指令,告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。

#include "xxx.h" 和 #include

有两种方式可以指定插入头文件:

#include 
#include "filename"

如果需要包含标准库头文件比如一些数学函数的原型等等,应该使用<>,如果需要包含自己程序所开发的源文件,应该使用""

这两种形式的#include行为是预处理器指定好的都是复制其他文件中的内容,区别在于搜索header文件时,二者的搜索路径不同,按照指定路径顺序搜索。

#include“xxx.h”搜索的路径覆盖了#include搜索的路径,但使用<>文件的路径是在标准include路径(关于这几个路径的搜索就不多说了),所以使用<>的效率更高。

在 #include 命令中使用宏

#include 命令也是可以使用宏的,例如

#ifdef        _DEBUG_#define       MY_HEADER       "blinky.h"
#else#define       MY_HEADER       "blinkyQP.h"
#endif#include        MY_HEADER

这样在我们调试的时候可以根据_DEBUG_是否定义来确定包含哪些头文件,当然你都包含也可以,但是会有重复包含的问题,后面会说到。

嵌套的 #include 命令

通过#include命令插入的源文件本身也可以包含另一个 #include 命令,预处理器最多允许15层的嵌套包含,但这种现象会发生相同的一个文件被多次包含的情况,例如

//blinky.h
#include 
...

如果blinky.c文件如下所示,就会直接与间接的两次包含stdio.h。

//blinky.c
#include 
#include "blinky.h"
...

那么如何避免多次包含呢,我们可以采用常用的条件式编译的命令,例如

#ifndef blinkY_H_
#define blinkY_H_
/* ...实际的头文件blinky.h的内容写在这里... */
#endif  /* blinkY_H_ */

在创建一个头文件时,可以用#define指令为它定义一个唯一的标识符blinkY_H_。通过#ifndef指令检查这个标识符blinkY_H_是否已被定义,如果已被定义,则说明该头文件已经被包含了,就不要再次包含该头文件;反之,则定义这个标识符名称,以避免以后再次包含该头文件。

打印文本内容比较长

#include
int main(void)
{printf#include"tech.txt"//tech.txt的内容为("ID:TechDreamer");return 0;
}
//输出ID:TechDreamer

在预编译的时候,将#include文件的内容嵌入到当前所在位置,当文本内容比较长,直接复制在源代码里面会显得代码冗余不美观,可以使用这种方法,等价于

#include
int main(void)
{printf("ID:TechDreamer");return 0;
}

C语言中#include只能包含.h文件吗?

C语言中#include可以include .c这样使用吗?是不是没见过,其实这样是可以的。

从语法角度讲,include的意思就是从当前位置包含另外一个文件,从这点讲,include .c文件是可行的,c编译器完全能够正常处理。

那怎么样包含.c文件呢?因为本文主要是讲#include的用法有哪些,这个就暂时不说啦,感兴趣的可以去了解一下。

但是为什么不常见include .c文件?我们需要了解.c与.h文件功能的区别。一般来说.h文件提供接口,.c文件提供具体的实现,不一定要一一对应。如果一个.c文作包含其他模块对应的.h文件,而这个.c文件可能有一些结构,变量等与包含其他模块的实现(.c文件)重复了,会导致出错,所以一般不会使用,毕竟我们不写奇葩的代码。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java常见的ide_在三个Java IDE中生成的三种常见方法

java常见的ide在本文中&#xff0c;我研究了NetBeans 8.0.2 &#xff0c; IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三种“通用”方法[ equals&#xff08;Object&#xff09; &#xff0c; hashCode&#xff08;&#xff09;和toString&#xff08;&#xff09; ]的区别…

深度linux安装依赖,Linux -- Ubuntu下载deepin wine依赖问题笔记

问题开始下载deepin-wine安装包, 请稍后…1.1udis86_1.72-2_i3 100%[>] 34.18K 87.3KB/s 用时 0.4s1.2deepin-fonts-win 15%[> ] 31.18K 1.72KB/s 用时 18s1.2deepin-fonts-win 100%[>] 207.88K 26.2KB/s 用时 6.7s2.1deepin-libwine_2 100%[>] 18.97M 132KB/s 用时…

什么是C语言中的隐式函数声明?

「1、什么是C语言的隐式函数声明」在C语言中&#xff0c;函数在调用前不一定非要声明。如果没有声明&#xff0c;那么编译器会自动按照一种隐式声明的规则&#xff0c;为调用函数的C代码产生汇编代码。下面是一个例子&#xff1a;int main(int argc, char** argv) {double x a…

群晖 上传 源文件不存在_群晖NAS连接百度网盘报错?原因是这样的

群晖NAS附带的云同步套件可以与国内外多个网盘连接 , 连接后可从云上下载数据亦可从本地将数据上传到云上。例如通过云同步套件连接百度网盘账号后可以便捷上传和下载数据 , 若网盘空间较大甚至可用来备份整个NAS等。不过现在看来群晖与百度网盘的合作似乎已经结束&#xff0c;…

ssl/tls服务器瞬时_SSL / TLS REST服务器–带有Spring和TomEE的客户端

ssl/tls服务器瞬时在构建系统时&#xff0c;开发人员通常会忽略安全性方面。 安全一直是令人担忧的重要问题&#xff0c;但是它比以前吸引了更高的关注。 就在今年&#xff0c;我们发生了像Heartbleed Bug或CelebrityGate丑闻这样的案件。 这与帖子无关&#xff0c;只是安全真正…

linux kvm百度云,容器与云|如何在 Ubuntu Linux 上使用 KVM 云镜像

如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像&#xff1f;如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机&#xff1f;如何在 Ubuntu Linux 上使用 KVM 云镜像&#xff1f;基于内核的虚拟机(KVM)是 Linux 内核的虚拟化模块&#xff0c;可将其…

C 的16个大坑,你能躲过几个?

首先说下C 和C语言有什么区别&#xff1f;分享一个我在知乎上看见的回答&#xff1a;C ≈ C with classes&#xff0c; C with STLC&#xff1a;面向机器编程C &#xff1a;面向编译器编程C 有个很重要的特性叫RAII&#xff0c;个人认为可以多多使用&#xff0c;相当方便。言归…

java 性能调优_Java性能调优调查结果(第三部分)

java 性能调优这是本系列文章的第三篇&#xff0c;我们将分析2014年10月进行的调查的结果。如果您尚未这样做&#xff0c;我建议从本系列的前两篇文章开始&#xff1a; 问题严重性分析和监视域分析 。 这篇文章着重于故障排除/根本原因检测。 本调查部分的背景&#xff1a;意识…

不懂指针类型,7个例子给你讲明白

1. int va;这是一个整型变量&#xff0c;32位CPU的话&#xff0c;占有32个bite2. int *va;这是一个整型指针变量&#xff0c;用于存放一个整型变量的地址&#xff0c;3. int **va;这是一个整型的二级指针&#xff0c;用于存放一个内存的地址&#xff0c;该地址对应的内存中存放…

Tomcat与Netty比较

Tomcat介绍Tomcat支持的协议Tomcat的优缺点Netty介绍Netty支持的协议Netty的优点和缺点Tomcat和Netty的区别Tomcat和Netty的应用场Tomcat和Netty来处理大规模并发连接的优化Tomcat与Netty的网络模型的区别Tomcat与Netty架构设计拓展 Tomcat介绍 Tomcat是一个免费的、开放源代码…

C或C 如何通过程序执行shell命令并获取命令执行结果?

1 应用场景最近在实际程序开发中&#xff0c;需要通过程序执行 shell 命令&#xff0c;并获取命令输出内容。但是系统自带的 system 只能返回命令执行成功与否&#xff0c;不能捕获命令输出。2 扩展性由于应用场景本就广泛&#xff0c;因此扩展性较好。此函数可以执行任意命令&…

linux centos7安装ngix,centos7 环境下安装nginx--Linux

本文将要为您介绍的是centos7 环境下安装nginx--Linux,具体完成步骤:一、安装前需要的编译环境准备1、安装makeyum install -y gcc automake autoconf libtool make2、安装gcc、gcc-cyum install -y gcc gcc-c3、关闭防火墙iptables -F4、关闭selinux#临时关闭&#xff1a;sete…

primefaces_使用PrimeFaces开发数据导出实用程序

primefaces我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述…

如何优雅地实现判断一个值是否在一个集合中?

如何判断某变量是否在某个集合中&#xff1f;注意&#xff0c;这里的集合可能并不是指确定的常量&#xff0c;也可能是变量。版本0#include int main(){int a 5;if(a 1 || a 2 || a 3 || a 4 || a 5){std::cout<<"find it"<<std::endl;}return 0;…

骚操作:利用强弱符号制作插件库

当有强符号和弱符号时&#xff0c;选择使用强符号那么我们正可以利用这个原则做以下事情&#xff1a;定义为弱符号&#xff0c;如果是弱符号&#xff0c;使用默认行为如果链接了库&#xff0c;是强符号&#xff0c;则使用外部定义行为以此来实现一个类似插件的功能。通俗一点说…

c语言里 t是什么作用,c语言里的\t是什么意思

c语言里的&#xff3c;t是什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;c语言里的&#xff3c;t是什么意思正宗叫法是“水平制表符”&#xff0c;就是在输出媒体上水平跳过多个空格…

函数或全局变量重复定义时会怎样?

可能有些朋友第一反应是&#xff0c;那肯定是编译不过喽&#xff1a;// fun.c #include void func() {printf("编程珠玑\n"); }// main.c #include void func() {printf("公众号\n"); } int main(void) {func();return 0; }编译&#xff1a;$ gcc -o main …

当C语言函数执行成功时,返回1和返回0究竟哪个好?

基本上&#xff0c;没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高&#xff0c;耦合性低的原则&#xff0c;尽可能的将代码拆分不同的功能模块&#xff0c;并封装成函数。C语言代码的组合千变万化&#xff0c;因此函数的功能可能会比较复杂&#xf…

ubuntu自定义安装里怎么选_超市里的五香粉怎么选?看懂配料表,两个小技巧,不怕选不好。...

点击右上角【关注】&#xff0c;可获得本头条号推荐的更多美食干货五香粉是家庭常用的一种调味料&#xff0c;焖、炖、烧、煮、卤都常备使用&#xff0c;如今市场上的五香粉品牌也是相当繁多&#xff0c;质量也是参差不齐&#xff0c;有时买到的五香粉烧制的菜肴根本就不好吃&a…

原来C语言还可以这样实现“泛型编程”!

在回答标题问题之前&#xff0c;先了解下什么是泛型编程。泛型编程&#xff08;generic programming&#xff09;是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型&#xff0c;在实例化时作为参数指明这些类型。C支持…