使用Visual Studio 2017作为Linux C++开发工具
Visual Studio 2017
微软的宇宙第一IDE Visual Studio 2017正式版出来了,地址是:https://www.visualstudio.com/vs/whatsnew/
VS2017亮点很多,包括模块化安装、启动速度加快(第一次启动加快50%以上)、github插件、启动页完善、增强代码提示功能,等等,更多参考:https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes。
Visual Studio 2017 Support for Linux Development
VS2017可以编辑、编译、调试linux上的c++、python、node.js程序(详细)。
甚至可以编译调试.NET程序,支持的Linux平台包括:
CentOS 7.1 and Oracle Linux 7.1
Debian 8
Fedora 23
Linux Mint 17
openSUSE 13.2
Red Hat Enterprise Linux 7.2
Ubuntu 14.04 and 16.04
博主主要是c++作为开发语言,并且绝大部分代码都有跨平台的需求。博主一般步骤如下:
在windows机器上使用visual studio开发大部分算法功能模块,并且调试优化完毕;在涉及到IO或者网络相关的部分,需要port到linux平台,痛苦的用vim编写代码,gcc编译,gdb调试。
重点关注其中Visual Studio在C++跨平台方面的亮点,即Visual C++ for Linux,有了它,就能用最先进的IDE进行跨平台的开发了,好开心!
Visual C++ for Linux
VC++ 2017支持在编写、调试Linux下的C++程序([详细(https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/))。
创建跨平台Linux C++程序,如图:
实际使用效果如下图,可以看到,能够在VS下面编译Linux代码,甚至包括linux特有的头文件。除了代码补全很爽之外,还有代码着色,可视化调试等各种优点。
使用步骤
1.目标linux机器上安装好编译环境与调试环境,如在ubuntu下,安装好openssh-server/g++/gdb/gdbserver等。
sudo apt-get install openssh-server g++ gdb gdbserver
2.本机安装好visual studio 2017,需要选择安装Cross Platform Linux C++环境。
3.打开Visual Studio,新建工程,选择Cross Platform/Linux/Console Application。
4.在第一次build之前会要求ssh连接到目标linux机器,填上用户名密码连接目标机器。如果需要更换目标机器地址,在Tools/Options/Cross Platform下进行管理。
5.设置好一系列选项(黑体部分),与普通的Win32程序的设置基本一致。需要注意如下2点:
vs不会自动把addtional include中的头文件复制到本地来做代码补全的提示,需要手动将linux下面的/usr/include、/usr/local/include等目录复制到vs的linux header path(如:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\usr)
头文件包含目录和库文件包含目录均为linux下的绝对路径。
6.编译时vs会将代码复制到目标机器的~/projects/[project-name]目录下,二进制文件在其目录的bin目录下。如下图,Linux环境下可以看到,已经有代码了。
实际开发
在初步使用体验中,感觉这个vs for linux还不是特别成熟,有不少问题,包括:复制文件速度过慢、无法多线程编译、编译输出信息丢失(不够友好)、无法操作跳板机等。
不过该工具作为编码的辅助工具,仍然非常具有价值,结合了vs强大的的代码编辑与调试功能和linux机器的天然服务器特性。未来可期!
本文详细解析了前端开发之CSS原理,非常有用,不懂的同学快来看看吧前端开发之CSS原理详解
从事Web前端开发的人都与CSS打交道很多,有的人也许不知道CSS是怎么去工作的,写出来的CSS浏览器是怎么样去解析的呢?当这个成为我们提高CSS水平的一个瓶颈时,是否应该多了解一下呢?
一、浏览器的发展与CSS
网页浏览器主要通过 HTTP 协议连接网页服务器而取得网页, HTTP 容许网页浏览器送交资料到网页服务器并且获取网页。目前最常用的 HTTP 是 HTTP/1.1,这个协议在 RFC2616 中被完整定义。HTTP/1.1 有其一套 Internet Explorer 并不完全支援的标准,然而许多其他当代的网页浏览器则完全支援这些标准。网页的位置以 URL(统一资源定位符)指示,此乃网页的地址;以 http: 开首的便是通过 HTTP协议登陆。很多浏览器同时支援其他类型的 URL 及协议,例如 ftp: 是 FTP(档案传送协议)、gopher: 是 Gopher 及 https: 是 HTTPS(以SSL加密的HTTP)。
早期的网页浏览器只支援简易版本的HTML。专属软件的浏览器的迅速发展导致非标准的 HTML 代码的产生。但随着 HTML 的成长,为了满足设计师的要求,HTML 获得了很多显示功能。随着这些功能的增加外来定义样式的语言越来越没有意义了。
1994年哈坤·利提出了 CSS 的最初建议。伯特·波斯(BertBos)当时正在设计一个叫做 Argo 的浏览器,他们决定一起合作设计CSS。
当时已经有过一些样式表语言的建议了,但 CSS 是第一个含有“层叠”的主意的。在 CSS 中,一个文件的样式可以从其他的样式表中继承下来。读者在有些地方可以使用他自己更喜欢的样式,在其他地方则继承,或“层叠”作者的样式,这种层叠的方式使作者和读者都可以灵活地加入自己的设计,混合各人的爱好。
1997年初,W3C 内组织了专门管 CSS 的工作组,其负责人是克里斯·里雷。这个工作组开始讨论第一版中没有涉及到的问题,其结果是1998年5月出版的第二版要求。到2007年为止,第三版还未完备。
二、浏览器是如何渲染页面和加载页面
为什么有些网站打开的时候会加载会很慢,而且是整个页面同时显示的,而有些网站是从顶到下逐步显示出来的?要搞懂这个可以先从下面这个常规流程开始:
1. 浏览器下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。
2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。
3. 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。
4. 并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。
5. 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。
6. JS、CSS中如有重定义,后定义函数将覆盖前定义函数。
这里关键的是第2-5这三点。渲染效率与下面三点有关:
1. CSS 选择器的查询定位效率
2. 浏览器的渲染模式和算法
3. 要进行渲染内容的大小
三、什么是 CSS 以及 CSS 的优点
什么是 CSS?
CSS 是 Cascading Style Sheets(层叠样式表)的简称。
CSS 语言是一种标记语言,它不需要编译,可以直接由浏览器解释执行(属于浏览器解释型语言)。
在标准网页设计中 CSS 负责网页内容 (XHTML)的表现。
CSS 文件也可以说是一个文本文件,它包含了一些 CSS 标记,CSS 文件必须使用 css 为文件名后缀。
可以通过简单的更改 CSS 文件,改变网页的整体表现形式,可以减少我们的工作量,所以它是每一个网页设计人员的必修课。
CSS是由W3C的CSS工作组产生和维护的。
采用 CSS+DIV 进行网页重构,相对与传统的 TABLE 网页布局而具有以下3个显著优势:
1. 表现和内容相分离。将设计部分剥离出来放在一个独立样式文件中,HTML文件中只存放文本信息。这样的页面对搜索引擎更加友好。
2. 提高页面浏览速度。对于同一个页面视觉效果,采用 CSS+DIV 重构的页面容量要比 TABLE 编码的页面文件容量小得多,前者一般只有后者的1/2大小。浏览器就不用去编译大量冗长的标签。
3. 易于维护和改版。你只要简单的修改几个 CSS 文件就可以重新设计整个网站的页面。
四、浏览器对 CSS 的匹配原理
浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找。比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:先查找 html 中所有 class='red' 的 span 元素,找到后,再查找其父辈元素中是否有p元素,再判断p的父元素中是否有 id 为 divBox 的 div 元素,如果都存在,则 CSS 匹配上。
浏览器从右到左进行查找的好处是为了尽早过滤掉一些无关的样式规则和元素。Firefox 称这种查找方式为 keyselector(关键字查询),所谓的关键字就是样式规则中最后(最右边)的规则,上面的 key 就是 span.red。
五、优化你的 CSS
所谓高效的 CSS 就是让浏览器在查找 style 匹配的元素的时候尽量进行少的查找,下面列出一些我们常见的写 CSS 犯一些低效错误:
1、不要在ID选择器前使用标签名
一般写法:DIV#divBox
更好写法:#divBox
解释:因为ID选择器是唯一的,加上div反而增加不必要的 CSS 匹配。
2、不要在 class 选择器前使用标签名
一般写法:span.red
更好写法:.red
解释:同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉,比如你css文件中定义如下:
p.red{color:red;} span.red{color:#ff00ff} |
如果是这样定义的就不要去掉,去掉后就会混淆,不过建议最好不要这样写
3、尽量少使用层级关系
一般写法:#divBoxp.red{color:red;}
更好写法:.red{..}
4、使用 class 代替层级关系
一般写法:#divBox ul li a{display:block;}
更好写法:.block{display:block;}
5、在 CSS 渲染效率中 id 和 class 的效率是基本相当的
class 会在第一次载入中被缓存,在层叠中会有更加好的效果,在根部元素采用id会具有更加好(id有微妙的速度优势)。
本篇文章主要介绍了struts2实现多文件上传的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧开发环境JDK1.8 eclipse struts2-2.3.31
1.创建web项目
2.导入struts2核心jar包
3.更改web.xml配置文件(只要配置好struts2的Filter就好)
4.创建src/struts.xml文件
代码如下 | 复制代码 |
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 --> <constantname="struts.action.extension"value="do"/> <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 --> <constantname="struts.serve.static.browserCache"value="false"/> <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 --> <constantname="struts.configuration.xml.reload"value="true"/> <!-- 开发模式下使用,这样可以打印出更详细的错误信息 --> <constantname="struts.devMode"value="true"/> <!-- 默认的视图主题 --> <constantname="struts.ui.theme"value="simple"/> <!--<constant name="struts.objectFactory" value="spring" />--> <!--解决乱码 --> <constantname="struts.i18n.encoding"value="UTF-8"/> <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) --> <constantname="struts.multipart.maxSize"value="10701096"/> <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir --> <constantname="struts.multipart.saveDir "value="d:/tmp"/>
<packagename="upload"extends="struts-default"> <actionname="fileUpload"class="com.ifan.action.FileUpload"> <!-- 动态设置savePath的属性值 --> <paramname="savePath">WEB-INF/images</param> <resultname="success">/success.jsp</result> <resultname="input">/error.jsp</result> <interceptor-refname="fileUpload"> <!-- 文件过滤 --> <paramname="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> <!-- 文件大小, 以字节为单位 --> <paramname="maximumSize">1025956</param> </interceptor-ref> <!-- 默认拦截器必须放在fileUpload之后,否则无效 --> <interceptor-refname="defaultStack"/> </action> </package> </struts> |
5.创建src/com.ifan.action.FileUpload.Java
代码如下 | 复制代码 |
packagecom.ifan.action;
importjava.io.File;
importorg.apache.commons.io.FileUtils; importorg.apache.struts2.ServletActionContext;
importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionSupport;
publicclassFileUploadextendsActionSupport{
privateFile[] image;//上传的文件 privateString[] imageFileName;//文件名称 privateString[] imageContentType;//文件类型
publicString execute()throwsException { ServletActionContext.getRequest().setCharacterEncoding("UTF-8"); String realpath = ServletActionContext.getServletContext().getRealPath("/images"); System.out.println(realpath); if(image !=null) { File savedir=newFile(realpath); if(!savedir.getParentFile().exists()) savedir.getParentFile().mkdirs(); for(inti=0;i<image.length;i++){ File savefile =newFile(savedir, imageFileName[i]); FileUtils.copyFile(image[i], savefile); } ActionContext.getContext().put("message","文件上传成功"); } return"success"; }
publicFile[] getImage() { returnimage; }
publicvoidsetImage(File[] image) { this.image = image; }
publicString[] getImageContentType() { returnimageContentType; }
publicvoidsetImageContentType(String[] imageContentType) { this.imageContentType = imageContentType; }
publicString[] getImageFileName() { returnimageFileName; }
publicvoidsetImageFileName(String[] imageFileName) { this.imageFileName = imageFileName; } } |
6.创建WebContent/index.jsp ,作为上传文件的页面
代码如下 | 复制代码 |
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%> <%@ taglib prefix="s"uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme() +"://"+ request.getServerName() +":"+ request.getServerPort() + path +"/"; %>
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"rel="external nofollow">
<title>My JSP'hello.jsp'starting page</title>
<meta http-equiv="pragma"content="no-cache"> <meta http-equiv="cache-control"content="no-cache"> <meta http-equiv="expires"content="0"> <meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"> <!-- <link rel="stylesheet"type="text/css"href="styles.css"rel="external nofollow"> -->
</head>
<body> <!-- Struts2的文件上传标签 --> <s:form action="fileUpload"namespace="/"method="POST"enctype="multipart/form-data"> <!-- 该name需要和后台的File类型的名字对应起来,否则将得不到该文件 size 上传文件的大小 --> <s:file name="image"label="Select a File to upload"size="40"/> <s:file name="image"label="Select a File to upload"size="40"/> <s:submit value="submit"name="submit"/>
</s:form>
</body> </html> |
7.创建WebContent/success.jsp 作为文件上传成功跳转的页面,创建WebContent/error.jsp 作为文件上传失败的页面 , 创建WebContent/images文件夹,作为上传文件的存储位置
本文介绍了Swift实现无限轮播效果的教程,文中给出了详细的实例代码,不会的朋友可以看看从今天开始,我学习的重点开始转向Swift,并且会分享一些自己学习的心得体会,今天给大家带来的的是无限轮播。广告页的无限轮播是非常常见的一个功能,大多数APP都有,大多数程序员也都实现过,今天我们用Swift实现一下。项目地址
图片切换我们可以选择的基本控件有两个UIScrollView 和 UICollectionView,这次我们选择UICollectionView;既然是轮播,就会用到Timer。所以,我们这次主要应用的知识点为UICollectionView 和 Timer;
代码如下 | 复制代码 |
import UIKit
classCycleScrollView: UIView, UICollectionViewDelegate,UICollectionViewDataSource {
var bottomView : UICollectionView? var width : CGFloat? var height : CGFloat? var timer : Timer?
override init(frame: CGRect){
super.init(frame: frame) // 1.设置背景色 self.backgroundColor = UIColor.clear // 2.设置宽高 width = self.frame.size.width height = self.frame.size.height // 3.添加bottomView setupBottomView() // 4.添加定时器 setupTimer() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
func setupBottomView() {
// 5.设置collectionView的布局 let flowLayout = UICollectionViewFlowLayout(); flowLayout.itemSize = self.bounds.size flowLayout.minimumLineSpacing = 0; flowLayout.minimumInteritemSpacing = 0; flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal; bottomView = UICollectionView.init(frame: self.bounds, collectionViewLayout: flowLayout) self.addSubview(bottomView!); // 6.设置collectionView的尺寸 bottomView?.contentSize = CGSize(width:width! * CGFloat(4),height:height!) // 7.分页 bottomView?.isPagingEnabled =true // 8.去掉滚动条 bottomView?.showsVerticalScrollIndicator =false bottomView?.showsHorizontalScrollIndicator =false // 9.设置代理 bottomView?.delegate = self bottomView?.dataSource = self // 10.注册cell bottomView?.register(UICollectionViewCell().classForCoder, forCellWithReuseIdentifier:"ID"); if#available(iOS 10.0, *) { // 11.预加载 bottomView?.isPrefetchingEnabled =true }else{ // Fallback on earlier versions } } func setupTimer() { // 12.实例化定时器 timer = Timer.init(timeInterval: 2, target: self, selector: #selector(timerAction), userInfo: nil, repeats:true); RunLoop.main.add(timer!, forMode: RunLoopMode.defaultRunLoopMode);
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
self.timer?.fire(); } } func timerAction() {
var contentOffsetX = (self.bottomView?.contentOffset.x)! + self.frame.size.width
ifcontentOffsetX > self.frame.size.width * 3 { // 当前视图显示的是第三个的时候,设置bottomView的偏移量为0 self.bottomView?.contentOffset = CGPoint(x:0,y:0) contentOffsetX = self.frame.size.width } self.bottomView?.setContentOffset(CGPoint(x:contentOffsetX,y:0), animated:true) } // 重写removeFromSuperview方法,用于删除定时器,否则定时器一直存在,浪费内存 override func removeFromSuperview() {
timer?.invalidate() timer = nil super.removeFromSuperview() } // Mark:UICollectionViewDataSource // 设置Itmes func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return4; } // 设置cell func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell : UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier:"ID",for: indexPath) forview : UIView in cell.contentView.subviews {
view.removeFromSuperview() } let imageView = UIImageView.init(frame: cell.contentView.bounds) ifindexPath.row < 3 {
imageView.image = UIImage.init(named: String(indexPath.row))
}else{ imageView.image = UIImage.init(named: String(0)) } cell.contentView.addSubview(imageView)
returncell; } // Mark:UICollectionViewDelegate // 点击方法 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("您点击了第 \(indexPath.row == 3 ? 0 : indexPath.row) 个"); }
} |
UICollectionView 和 Timer的用法和OC基本相同。Swift和OC的UI部分应该是一致的,因为底层都是OpenGL。我直接说一下区别:
1.Timer:如果重复,OC是等一个间隔再执行的,Swift是立即执行的,所以我用了GCD延时开启定时器。
2.Swift 没有 CGPointZero。
无限轮播的原理就是在最后面多添加一个和第一个相同的itme。当你滑动到最后一个itme时,把UICollectionView的contentOffset置零,继续向右活动。如果不添加,会给用户一种卡顿的感觉。
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- 这篇文章主要介绍了Rstudio中安装package出现的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 这篇文章主要为大家详细介绍了Visual Studio 2015下载和安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
- mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
关于Visual Studio无法打开源文件"stdio.h"问题
这篇文章主要介绍了关于Visual Studio无法打开源文件"stdio.h"问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-03Postman安装与使用详细教程 附postman离线安装包
这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05