#include实际上是医生命令。编译器处理此语句时,将预处理此“命令”及其后面的“参数”。
在c/c++语言代码中常常会遇见各种#include的应用。这篇文章将从C语言标准手册入手,深入解析各种#include的用法。
1.#include<h-char-sequence>
尖括号(angle bracket)的include是重点是突出包括一个“头”(header),而非“头文件”(headerfile)。参考C语言标准文档有以下信息:
searchesa sequence of implementation-defined places for a headeridentifieduniquely by the specified sequence between the < and delimiters,and causes the replacement of that directive by the entire contentsof the header. How the places are specified or the header identifiedis implementation-defined.
编译器会按照自己规则去寻找那个与“h-char-sequence”相对应的唯一标识符的“头”(header),然后再把那个“头”中所有的内容替换掉“#include<h-char-sequence>”所在位置。“头”不一定是文件,也可能是编译器自己内建(build-in)的“头”。至于它寻找这个“头”的方式会因编译器的不同而不同。例如gcc/g++会在某个目录下寻找头文件,也或者会根据“-Ipath_to_include/”这样的位置来寻找“头”。
2#include"q-char-sequence"
双引号(quotation marks)的include重点突出的是包括一个“源文件”。同样,在C语言标准文档有如下信息:
causesthe replacement of that directive by the entire contents of thesource file identified by the specified sequence betweenthe " delimi named source file is searched for in an implementation-definedmanner. If this search is not supported, or if the search fails, thedirective is reprocessed as if it read
编译器会寻找一个与“q-char-sequence”相同的“头源文件”,然后将该“头源文件”的内容替换掉“#include“q-char-sequence””这一行。如果这一步寻找失败,那么将会再处理“q-char-sequence”这个字符串。通常的再处理方式就是再把它按照1中尖括号处理的方式一样来处理它。这就是为什么用双引号来包含一个头文件时,这个头文件一般就位于与源代码文件相同的文件夹中。因为按照编译器的通常做法,就是在当前目录下寻找这个“头源文件”。
3#include pp-tokens
这种情况是include背后是一个没有分界符的字符串。这种情况下也是允许的。同样,在C语言标准文档也有这样的描述:
(that does not match one of the two previous forms) is permitted. Thepre processing tokens after include in the directive are processed just as in normal text. (Each identifier currently defined as a macro name is replaced by its replacement list of preprocessing tokens.) The directive resulting after all replacements shall match one of the two previous forms. The method by which asequence of preprocessing tokens between a < and a preprocessing token pair or a pair of " charactersis combined into a single header name preprocessing token is implementation-defined.
因为编译器在预编译的时候会先暂时把所有的标识符定义成宏的都先替换成宏的原来的内容。所以这种情况下“pp-takens”会被替换成另外一个字符(当然,如果前面没有定义这样的宏,那么这句话就是非法的)。再然后就会和1,2同样的处理方式处理。(具体怎么按照1还是2,这还得根据不同编译器而定)。
最后还要提起的是,头文件的后缀名不一定非得是.h*。它甚至可以没有后缀。c++中很多标准头文件就没有后缀名(例如cstring,string这种标准c++头文件)。
(原创作品,未经授权,不得转载)
作者:iamnotstone
编辑:i艾技术
1.文章《(include是什么语言)include什么意思C语言…》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《(include是什么语言)include什么意思C语言…》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好