#include指令详解

做c/c++编程的对#include指令都不会陌生,绝大多数人也都知道如何使用,但我相信仍有人对此是一知半解的,
C:
#include <stdio.h>
C++:
#include <iostream>
表示包含C/C++标准输入输出头文件。 包含指令不仅仅限于.h头文 件,可以包含任何编译器能识别的C/C++代码文件,包括.c、.hpp、.cpp、.hxx、.cxx等,甚至.txt、.abc等等都可以。
预处理器发现 #include 指令后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当 前文件中。被包含文件中的文本将替换源代码文件中的#include 指令 , 就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。 preprocess
预处理:为方便编译器处理而设置的一种机制,包括一些常用预处理指令和语句,我们统称为预处理系统。
如#include #define #if...#else...#endif #pragma等
这些指令的实现是由编译器来决定的(implementation specified)
提到预处理指令,顺便说一下头文件防止重复包含的2种方法
a.保护宏(暂且称为Macro guard 宏卫兵?):
#ifndef _ABCDE_H
#define _ABCDE_H
/*
代码部分
*/
#endif
在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码
还有一种特定编译器支持的指令:
b.#pragma once
能保证该文件(物理上的)只被编译一次,也能起到防止重复包含的作用
但这2种方式是有区别的:
a.Macro guard可移植性好,绝大多数编译器都支持,而且万一不小心拷贝了几分相同的代码也不会出问题,但你得确保这个宏名不会与其他的宏冲突,否则等编译器报出一大堆错误的时候你可能会觉得莫名其妙;
b.#pragma once指令简单,它能保证该文件(物理上的)只被编译一次,不用去费劲的想不同的宏名,但如果有几份该文件的拷贝,显然起不到作用。
declaration
声明:指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性
例如:
int main(void)
{
int a; // 声明了变量a,类型为int
int *pa; // 声明了变量pa,类型为指向int型的指针类型
}
definition
定义:除了以下情况,声明就是定义
a.声明函数但不包括函数体;
b.声明包含extern链接限定符,例如:extern int a;
c.声明既没有初始化语法,也没有函数体;
d.类声明中声明静态数据成员;
e.类名字声明;
f.typedef声明;
g.using声明或者using指令;
以上情况适用于C具有的特征,C++则完全适用,一般来说定义要为其对象分配或预留存储空间,而声明则不用。
translation unit
编译单元:一个源文件,.c .cpp等和它所包含的文件一起,在经过预处理之后形成一个源码文件,标准称之为translation unit(编译单元)包括一系列的声明和定义;一个program(程序)由一个或多个编译单元组成。编译器将各个编译单元编译为目标代码(.obj),通过连接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、静态库、动态库等)。
one definition rule
一次定义规则:是指定义在所有进入连接的编译单元中只能有一次。 A:头文件只放声明
example_a.h
void function();
example_a.cpp:
#include example_a.h
void function()
{}
B.被包含的文件可以使用任意扩展名:
只要是用符合标准的代码编写的文本文件,就可以使用#include来进行包含,包括.cpp .c等常见的源文件扩展名;
example_b_1.b
void function();
example_b_1.cpp:
#include example_b_1.b
void function()
{}
example_b_2.b
void function1();
void function2();
example_b_21.cpp:
void function1()
{}
example_b_22.cpp:
#include example_b_1.b
#include example_b_21.cpp
void function2()
{}
上面的例子中,example_b_21.cpp仅被包含在example_b_22.cpp中,不再被其他的文件包含,而且不加入工程中;
C.标准头文件的使用
最新的C++标准库中的一切内容都被放在名字空间std中 (名字空间中的内容对外是不可见的),但是带来了一个新问题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能, 如声明在<iostream.h>;等头文件中的功能,使用std包装标准库导致现有代码的不可用,为了 兼容这种情况,标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一 样,只是没有.h这个后缀,如<iostream.h>;就变成了<iostream>;。对于C头文件,采用同样的方法,但还在每个头文件名前加了字符c,如<string.h>;就变成了<cstring>;,<stdio.h>;变成了<cstdi o>;。最好使用新的文件头,使用新的文件头的C++程序,需要 使用using namespace std或者using namespace std::指定的类名,等方法来使需要的类对于我们的代码可视。 Include 指令
在JSP中包含一个静态的文件,同时解析这个文件中的JSP语句.
JSP 语法
<%@ include file=relativeURL %>
例子
include.jsp:
<html>
<head><title>An Include Test</title></head>
<body bgcolor=white>
<font color=blue>
The current date and time are
<%@ include file=date.jsp %>
</font>
</body>
</html>
date.jsp:
<%@ page import=java.util.* %>
<%= (new java.util.Date()).toLocaleString() %>
Displays in the page:
The current date and time are
Aug 30,1999 2:38:40 <%@include %>;指命将会在JSP编译时插入一个包含文本或代码的文件,当你使用<%@ include %>;指命时,这个包含的过程就当是静态的。静态的包含就是指这个被包含的文件将会被插入到JSP文件中去,这个包含的文件可以是JSP文件,HTML文件,文本文件。如果包含的是JSP文件,这个包含的JSP的文件中代码将会被执行。
如果你仅仅只是用include 来包含一个静态文件。那么这个包含的文件所执行的结果将会插入到JSP文件中放<% @ include %>;的地方。一旦包含文件被执行,那么主JSP文件的过程将会被恢复,继续执行下一行.
这个被包含文件可以是html文件,jsp文件,文本文件,或者只是一段Java代码,但是你得注意在这个包含文件中不能使用<html>,</html>,<body>,</body>;标记,因为这将会影响在原JSP文件中同样的标记 ,这样做有时会导致错误.
有一些<%@ include %>;指命的行为是以特殊的JSP编译条件为基础,比如:
这个被包含的文件必须对所有客户都有开放且必须f有效,或者它有安全限制
如果这个包含文件被改变,包含此文件的JSP文件将被重新编译
属性:
file=relativeURL
这个包含文件的路径名一般来说是指相对路径,不需要什么端口,协议,和域名,如下:
error.jsp/templates/onlinestore.html/beans/calendar.jsp
如果这个路径以/开头,那么这个路径主要是参照JSP应用的上下关系路径,如果路径是以文件名或目录名开头,那么这个路径就是正在使用的JSP文件的当前路径.
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <>是C/C++中的一种预处理指令,用于引入系统头文件。系统头文件是编译器提供的标准库头文件,用于定义常用的函数和数据类型。使用#include <>可以在代码中引用系统头文件,以便使用其中定义的函数和数据类型。 一个值得注意的地方是,使用#include <>时,编译器会在标准库的预定义路径中查找头文件。这意味着系统头文件应该位于编译器已知的位置,通常是编译器的安装目录下的特定文件夹。因此,我们不需要指定完整的文件路径,只需要提供头文件名即可。 例如,使用#include <stdio.h>可以引入标准输入输出的相关函数,如printf和scanf。 另外,还需要注意的是,使用#include <>时,编译器会首先在系统头文件目录中查找头文件,如果找不到,则会报错。因此,我们需要确保系统头文件存在于编译器的搜索路径中。 总结起来,#include <>用于引入系统头文件,编译器会在标准库的预定义路径中查找头文件。我们只需要提供头文件名即可,不需要指定完整的文件路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言#include的用法详解](https://blog.csdn.net/Elanie1024/article/details/128800554)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C语言,#include “” 和 #include <>的区别及具体讲解](https://blog.csdn.net/weixin_47545694/article/details/131338420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值