- C++主流编辑器特点比较
FrostedLotus·霜莲
c++编辑器开发语言
在C++开发中,选择一款合适的编辑器或集成开发环境(IDE)至关重要。本文将介绍几款常见的C++编辑器/IDE的特点,帮助开发者根据自身需求做出选择。1.Dev-C++Dev-C++是一款经典的轻量级C/C++IDE,特别适合初学者和教育用途。**主要特点:**-**轻量简洁**:安装包小(约50MB),启动快速,系统资源占用低-**集成开发环境**:内置编辑器、编译器、调试器,无需复杂配置-**
- C++中的面向对象编程
克斯维尔的明天_
c++开发语言
C++OOP面向对象编程,顾名思义,在编程中使用对象。面向对象编程旨在在编程中实现现实世界的实体,如继承、隐藏、多态性等。OOP的主要目标是将数据和对它们进行作的函数绑定在一起,以便代码的其他部分除了该函数之外,其他任何部分都无法访问这些数据。概述Class类C++中面向对象编程的构建块是Class。它是一种用户定义的数据类型,充当蓝图,表示一组共享一些常见属性和行为的对象。这些属性存储为数据成员
- C++中的前置声明
mj348940862
C++c++数据结构开发语言
一般来说,当你某个文件中,需要用到某个类或者结构体的指针,但是却不能直接包含那个类或者结构体的声明文件时,可以用前置声明解决。前置声明是指对类、函数、模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义。在很多场合我们可以用前置声明来代替#include语句。类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小,成员等具体内容。在未提供完整的类之前,不能定义该类的对象,也不能在内联成员
- Boost.Asio 同步读写操作详解
Boost.Asio同步读写操作详解Boost.Asio是一个高效的C++网络和底层I/O库,提供了多种API用于同步和异步数据传输。本文将详细介绍同步操作及其具体实现,包括write_some、send、write、read_some、receive、read和read_until等。1.同步写:write_some功能:将指定数量的字节写入到套接字。如果发送缓冲区已满,则只写入一部分数据并返回
- c++中类的前置声明
2301_80355452
c++java开发语言
前置声明(forwarddeclaration)和包含头文件(includeheaderfile)是C/C++程序设计中经常遇到的两个基础概念。它们都和“让编译器知道有哪些类型、函数”等信息相关,但本质和作用是完全不同的。下面我会详细、通俗地讲解二者的区别,以及什么情况下选用哪一种。1.前置声明是什么?前置声明(forwarddeclaration)就是提前告诉编译器“小样,后面我会实现/定义一个
- 【Rust日报】2024年Rust回顾:接下来是什么?
Rust语言中文社区
rust开发语言后端
Avian-一个基于ECS(实体组件系统)的2D和3D物理引擎Avian是一个基于ECS(实体组件系统)的2D和3D物理引擎,专为Bevy设计,Bevy是一个在Rust中构建的,非常简洁的数据驱动游戏引擎。Avian注重人体工程学和模块化设计,重点提供一种原生的、由ECS驱动的用户体验。https://joonaa.dev/blog/07/avian-0-22024年Rust回顾:接下来是什么?本
- C++标准库大全(STL)
C++标准库大全(STL)1.容器(Containers)*问题类型:序列容器(std::vector,std::deque,std::list,std::forward_list,std::array,std::string):各自的特点、底层实现、优缺点和适用场景?容器特点底层实现优点缺点适用场景std::vector动态数组,支持快速随机访问连续内存+三指针(数据头/尾/容量尾)随机访问O(
- C++之类的前置声明
疯丶
C++
文章目录什么是前置声明为什么要引入前置声明前置声明的应用场景怎么使用前置声明前置声明的优点前置声明的缺点什么是前置声明前置声明(ForwardDeclaration),顾名思义,就只是一个声明,并不包含其定义。为什么要引入前置声明试想一下,如果需要在头文件A.h中使用另一个头文件B.h中的类B,有哪些做法?1.把类B直接挪到A.h中(完全不推荐)2.在A.h中包含B.h(写法为#include“B
- 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200 (蓝桥杯训练题库)c/c++
#includeinti,n,j,v;intsort(int*a,intn){for(i=0;ia[j]){v=a[i];a[i]=a[j];a[j]=v;}}intmain(){scanf("%d",&n);inta[200];for(i=0;i#includeusingnamespacestd;intmain(){intn;cin>>n;inta[200];for(inti=0;i>a[i];
- c++中的绑定器
2301_80355452
c++开发语言算法
C++中的“绑定器”其实是指函数绑定工具,主要是用来将函数、对象、参数等绑定在一起,用于后续调用。这在回调函数、事件处理、异步编程中非常常见。接下来我会详细、通俗地介绍“绑定器”的核心概念、用法,以及一些常用的标准库工具。一、什么是“绑定器”?简单来说,绑定器就是一个能够绑定(封装)函数和其参数的工具或对象,让你可以像调用普通函数一样调用它,背后实际上是调用被绑定的函数并传递绑定的参数。举个生活例
- explicit
在C++中,explicit是一个非常重要的关键字,主要用在类的构造函数前面,用来控制类对象的隐式转换行为。下面我会用通俗易懂的方式详细说明它的作用、常见的用法,以及为什么要使用它。一、基本概念:什么是explicit?没有explicit的构造函数,在某些情况下,编译器会允许隐式转换,让某个类型的对象自动转换为另一种类型,或者用一个参数的构造函数把值“自动”变成对象。**加上explicit**
- [OC]C++计算e(自然常数)
OC溥哥999
C++懒人套餐算法开发语言c++
自然常数,符号e,为数学中一个常数,是一个无限不循环小数,且为超越数,其值约为2.718281828459045。它是自然对数函数的底数。有时称它为欧拉数(Eulernumber),以瑞士数学家欧拉命名;也有个较鲜见的名字纳皮尔常数,以纪念苏格兰数学家约翰·纳皮尔(JohnNapier)引进对数。它就像圆周率π和虚数单位i,是数学中最重要的常数之一。摘自秒懂百科计算方式一:e=1/0!+1/1!+
- (转载)Box2D v2.3.0 用户手册中文版(第1章)-导言
Chapter1导言1.1关于Box2D是一个用于游戏的2D刚体仿真库。程序员可以在他们的游戏里使用它,它可以使物体的运动更加真实,并让游戏世界看起来更具交互性。从游戏引擎的视角来看,物理引擎就是一个程序性动画(proceduralanimation)的系统。(译注:做动画常有两种方法,一种是预先准备好动画所需的数据,比如图片,再一帧一帧地播放。另一种是以一定方法,动态计算出动画所需的数据,根据数
- C# 的DllImport
CHANGHAI1982
编程交流C#c#apiwinapidll.netgoogle
最近在读《编程之美》,打算用C#实现其中一个题目,就是如何控制CPU的使用率在50%,使得在资源管理器中CPU利用率维持在一条直线。单核的还容易办到,但是现在的机器一般都是多核的,这样就需要调用Win32APISetThreadAffinityMask来给线程制定CPU去执行。但这个API只能在C++调用,那么在C#里如何调用呢?更进一步,就是在C#里为什么没有全部的WIN32API可以调用呢?有
- C++协程的高性能并发编程的技巧指南
广州山泉婚姻
c++
一、理解C++协程基础协程是一种比线程更轻量级的执行单元,它允许函数在执行过程中暂停和恢复,而不需要像线程那样进行复杂的上下文切换。在C++中,协程通过co_await、co_yield和co_return三个关键字实现。co_await用于等待某个异步操作完成,当操作未完成时,协程会暂停执行,释放CPU资源,直到操作完成后再恢复执行。co_yield则常用于生成器模式,在迭代过程中暂停并返回中间
- C++编程:打造角色扮演游戏
夏勇兴
本文还有配套的精品资源,点击获取简介:本项目“C++实现的角色扮演游戏”通过构建一个游戏示例,帮助学习者掌握C++编程,特别是C++17特性。项目涵盖了类、对象、继承、多态、模板、异常处理、文件操作、动态内存管理、STL、函数与运算符重载、构造和析构函数等关键概念。参与者将通过实际操作,加深对面向对象编程的理解,并为复杂项目开发打下基础。1.C++编程基础和C++17特性1.1C++编程的起源与优
- EZ-USB FX2 USB接口控制器芯片项目实战指南
夏勇兴
本文还有配套的精品资源,点击获取简介:”ez-usbfx2”是CypressSemiconductor推出的USB接口控制器芯片,专为嵌入式系统设计。它简化了USB通信过程,并且与VisualStudio2005兼容,使开发者能够通过USB接口控制设备和传输数据。该芯片集成了USB协议栈,简化了USB设备开发流程,提供了多种串行接口与GPIO,支持即插即用和热插拔。开发ez-usbfx2项目涉及编
- 好记性不如烂笔头--使用dotnet-gcdump分析.net core程序内存泄漏
学无止境Coding
性能分析工具C#.net.net.netcorebugvisualstudiowindows
系列文章目录第一章使用ANTSMemoryProfiler排查.net内存泄漏问题https://blog.csdn.net/pdsazj/article/details/128259980第二章使用dotnet-gcdump分析内存泄漏目录前言一、dotnet-gcdump是什么?二、使用步骤1.安装命令2.使用3.分析数据a.使用VisualStudio对单个gcdump文件进行分析b.使用V
- 【.NET Framework 窗体应用程序项目结构介绍】
¥-oriented
C#学习.net
在使用VisualStudio(VS)开发.NETFramework窗体应用程序(WindowsFormsApp)时,项目结构通常包含以下核心文件夹和文件。以下是详细介绍:1.项目根目录下的主要文件(1).csproj文件作用:C#项目文件,定义项目配置(如编译选项、引用库、目标框架等)。示例内容(.NETFramework4.8):v4.8WinExe关键点:.NETFramework项目通常使
- Unity使用讯飞语音模型(语音合成+语音识别+语音唤醒)Window端SDK
苏轼轼
语音识别人工智能
1.查看官方文档、登录并下载我们所需的SDK。语音唤醒需要我们设置唤醒词。讯飞智能语音SDK文档官网讯飞智能语音产品介绍官网在控制台下载对应SDK,由于讯飞官方只提供了C++/C语音版本,我们需要用C#调用下载SDK的dll库文件。2.将dll库拖进Unity项目中如果目标设备为64位,我们选择msc_x64.dll;如果是32位,我们选择msc.dll。另外我们如果要使用语音唤醒功能,还需要wa
- C++小游戏:欢乐赌场
独孤求拜1024
c++
废话赌博有害,请勿赌博#includeusingnamespacestd;structnode{stringname;intmoney;};nodedu[100];intmain(){srand(time(NULL));intn;cin>>n;for(inti=1;i>du[i].name;du[i].money=100;}inta,d[400],z[400];while(1){for(inti=
- C++中那些不为人知的秘密
独孤求拜1024
c++开发语言
1.换行的秘诀大部分菜鸟接触到C++用的换行都是endl,但是endl太慢!。"\n"比endl快很多倍,举个例子大家就知道了。endl#includeusingnamespacestd;intmain(){for(inti=1;iusingnamespacestd;intmain(){for(inti=1;i#defineendl"\n"usingnamespacestd;intmain(){f
- C++走迷宫问题
独孤求拜1024
C++函数C++c++算法
迷宫基本构成:起点,终点,障碍1.方向数组方向数组是解决迷宫问题必不可少的“利器”,它能使遍历某个位置的前、后、左、右更加方便。例如:#includeusingnamespacestd;intfx[5]={0,0,1,-1};intfy[5]={1,-1,0,0};//fx数组控制上下,fy数组控制左右inta[110][110],n,m;intmain(){cin>>n>>m;for(inti=
- C++菜鸟必看——sort排序的3种用法
sort排序是一种有排序功能的函数,运用起来十分简单粗暴,也很省时间,是偷懒的不二选择。①普通sort格式:sort(a,a+n);//a是数组名,a+n代表a数组里从零到n按从小到大的顺序排序#include//万能头usingnamespacestd;intmain(){intn;cin>>n;inta[n];for(inti=0;i>a[i];//输入sort(a,a+n);//从小到大排序
- CCF GESP C++编程 六级认证真题 2025年3月
C++六级2025年03月题号123456789101112131415答案DBABBBBAAAAABCA一、单选题第1题在面向对象编程中,类是一种重要的概念。下面关于类的描述中,不正确的是()。A.类是一个抽象的概念,用于描述具有相同属性和行为的对象集合。B.类可以包含属性和方法,属性用于描述对象的状态,方法用于描述对象的行为。C.类可以被实例化,生成具体的对象。D.类一旦定义后,其属性和方法不
- C++为什么中不应该返回局部变量的地址
i love 3
C++返回引用c++return
最近在写代码的时候遇到返回局部变量的引用问题,认识不是很清晰,下面是转自http://blog.csdn.net/tujinqiuqq85948239/article/details/27236677博文的详细解释!在EffectiveC++中明确指出:不应该返回局部变量的引用,原因在于:局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。如果比较理解函数局
- Linux c/c++ 串口编程
静止了 所有的花开
linuxc++物联网
封装了一下Linux下的串口操作serial.h:#ifndef_SERIAL_H_#define_SERIAL_H_#include#includeclassSerial{public:Serial();intopenPort(constchar*path);intset(speed_tspeed);intsend(constvoid*buf,size_tsize,intsec,intmsec,
- CppCon 2018 学习:A Semi Compile/Run-time Map with (Nearly) Zero Overhead Looup
虾球xz
CppCon学习开发语言c++
介绍一个C++和Java之间桥接(Bridge)系统的示例代码,它说明了如何在C++中调用Java类(如java.io.InputStream)的方法。下面是详细解读:一、内容来源说明《C++↔JavaBridge》目的:演示如何通过桥接层让C++直接调用Java方法(JNI背后封装)二、代码结构解读classInputStream//java.io.InputStream{public:inli
- 使用c++编写一段人脸识别眨眼检测的代码
语嫣凝冰
c++opencv计算机视觉图像处理开发语言
我可以给你一些大致的步骤:使用摄像头或图像文件获取视频帧。使用人脸检测算法检测视频帧中的人脸。对检测到的人脸进行眼睛检测。判断眼睛是否闭合,如果是则认为该人在眨眼。以下是一段使用OpenCV库编写的C代码示例:```#include#include#include#includeusingnamespacestd;usingnamespacecv;intmain(){//使用摄像头获取视频帧Vid
- Effective Go 编程技巧总结
强哥之神
golang人工智能GPU调度linux语言模型云计算
Go是一种新兴的编程语言。尽管它借鉴了其他语言的许多特性,但也具备一些独特的属性,使得用Go编写的高效程序在风格上与其他语言编写的程序有所不同。直接将C++或Java程序翻译成Go代码,通常无法取得令人满意的结果——Java程序的编写方式是Java风格,而非Go风格。另一方面,如果从Go的语言特性出发去思考问题,可能会编写出风格截然不同但更为成功的程序。换句话说,要编写出优秀的Go代码,理解Go语
- java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
- 《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
- 电驴链接在线视频播放源码
dubinwei
源码电驴播放器视频ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
- Javascript中函数的toString()方法
周凡杨
JavaScriptjstoStringfunctionobject
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
- struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
- Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
- SpringMVC的各种参数绑定方式
Harry642
springMVC绑定表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
- Java 获取Oracle ROWID
aijuans
javaoracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
- java获取方法的参数名
antlove
javajdkparametermethodreflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
- JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java正则表达式替换提取查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
- Java中equals()与hashCode()方法详解
bijian1013
javasetequals()hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
- 精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle数据库plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
- 【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
- kafka获得最新partition offset
blackproof
kafkapartitionoffset最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
- centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
 
- java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
- nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
- [JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
- 如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
- 应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
- 在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
- 使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
- 使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
- SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
- 《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
- AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
- 架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
- 如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
- C语言算法之水仙花数
qiufeihu
c算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
- JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include