CE-RTI开源软件代码学习笔记(一)
1、int main(int argc, char *argv[])
当刚看到这句话的时候,是没有什么感觉的,因为从刚开始接触c++以来就经常见到这句话,只当它是所有c++程序的开头罢了,当我看到接下来的代码中在利用()里面的参数时,我是懵圈的,我才发现我竟然不了解这句话的意思。
main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。
C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。
由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。
DOS提示符下命令行的一般形式为: C:\>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在
位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。例如有命令行为: C:\>e24 BASIC dbase FORTRAN由于文件名e24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予,其中第0个参数是程序的全名。其表示如下所示:
main(int argc,char *argv){
while(argc-->1)
printf("%s\n",*++argv);
}
本例是显示命令行中输入的参数如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。
因此输入的命令行为: C:\>e24 BASIC dBASE FORTRAN
则运行结果为:
BASIC
dBASE
FORTRAN
一般情况下,在windows下不太常用,只是在Linux程序中用的较多。
2、getenv()\putenv()
getenv(const char* varName):获取环境变量名称varName的环境变量的值
putenv(const char* varString):将当前的环境变量varString添加的环境中,设置的环境仅对程序本身有效,不会反映到外部环境
3、std::signal(SIGINT, SignalHandler);
signal函数原型:
void (*signal (int sig, void (*func)(int)))(int);
第一个参数为 整数,标识信号号码;第二个参数标识 一个指向信号处理函数的指针,即第二格参数其实是一个函数指针;
参考文档:http://wiki.jikexueyuan.com/project/cplusplus/signal-handling.html
http://blog.csdn.net/ta893115871/article/details/7475095
不过,signal函数大部分情况下是用在unix下,windows下的编程很少用到。
4、std::set_new_handler(NewHandler);
std有一个set_new_handler函数,它接受和返回一个new_handler类型,用于设置当前当使用new操作符无法分配足够内存时而抛出bad_alloc异常的处理函数。new_handler其实是一个void (void)函数,你可以在头文件<new>中看到它的typedef:typedef void(*new_handler)();
所以std::set_new_handler其实是接受一个不接受参数也无返回值的函数的函数指针。而这个函数就被用来处理bad_alloc异常。
这句话的意思就可以理解为:当程序中的new操作或着new[]操作失败时,将调用NewHandler指向的函数。
5、select()
select()函数:确定一个或多个套接口(Socket)的状态,对于每一个套接口,调用者可以查询它的可读性、可写性及错误状态信息。用fd_set结构来标识一组等待检查的套接口,在调用返回时,这格结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd_set的操作,这些宏与unix软件中的兼容,但内部的表达是完全不同的。
select()是属于一个比较大的范畴了,而且又分windows和unix的区别,具体资料不再此骜述,具体资料可参考一下资料:
http://blog.csdn.net/pugu12/article/details/46863715
http://blog.csdn.net/leo115/article/details/8097143
http://www.cnblogs.com/renyuan/p/5100184.html
http://blog.sina.com.cn/s/blog_4900f3fb0100k20a.html
6、std::auto_ptr<>
auto_ptr是一个模板类,定义如下:
template <typename Type>
class auto_ptr {...};
它存储的是一个指向Type的指针。
顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存。
auto_ptr构造函数:std::auto_ptr<Billard> billard(createBillard(args.demo_given, args.demo_arg, federate));
这句话的意思就是,用auto_ptr定义了一个Billard类的一个实例billard,同时为Billard的构造函数传递了参数 createBillard(args.demo_given, args.demo_arg, federate)的返回值
参考文章:http://blog.csdn.net/monkey_d_meng/article/details/5901392
http://blog.163.com/hbu_lijian/blog/static/126129153201242124741769/
7、构造函数初始化
构造函数初始化成员变量有两种方式,一是传统的方式,即;
CSomeClass::CSomeClass()
{x=0;
y=1; }
还有一种是采用成员初始化列表的形式:
CSomeClass::CSomeClass() : x(0), y(1)
{
}
采用成员初始化列表的形式有两格原因:
第一:当初始化另一个类的成员。如:
class CMyClass {
CMember m_member;
public:
CMyClass();
};
//必须使用成员初始化列表
CMyClass::CMyClass() : m_member(2)
{
...
}
没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。
第二:基于效率的考虑,不再骜述。
需要说明的是,成员初始化列表是按照在类中成员声明的顺序进行初始化的,而不是按照在成员初始化列表里面定义的顺序。
参考文章:http://blog.csdn.net/ianchoi/article/details/6917899
8、std::vector<std::string>
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
或者连在一起,使用全名:
std::vector;
建议使用全局的命名域方式:
using namespace std;
在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。
参考文章:http://blog.csdn.net/zhoujiaxq/article/details/9787341
https://ceeji.net/blog/cpp-std-vector/
http://blog.csdn.net/infoworld/article/details/15736305
CE-RTI开源软件代码学习笔记(一)相关推荐
- 2018中国人工智能开源软件发展白皮书-笔记
"2018中国人工智能开源软件发展白皮书"是新手了解人工智能技术原理和技术现状的好文档,读完之后有再读几遍的冲动,学到了很多东西,做了笔记分享给大家共同学习,有不对的地方多多指出. ...
- 软件调试学习笔记(七)—— 单步步入单步步过
软件调试学习笔记(七)-- 单步步入&单步步过 单步步入 设置单步异常 处理单步异常 实验1:单步异常的设置与处理 单步步过 实现思路 实验2:实现单步步过 单步步入 描述: 单步步入的实现依 ...
- 软件调试学习笔记(六)—— 硬件断点
软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...
- 软件调试学习笔记(五)—— 软件断点内存断点
软件调试学习笔记(五)-- 软件断点&内存断点 调试的本质 软件断点 软件断点的执行流程 分析INT 3执行流程 实验:处理软件断点 内存断点 内存断点的执行流程 实验:处理内存断点 调试的本 ...
- 软件调试学习笔记(四)—— 异常的处理流程
软件调试学习笔记(四)-- 异常的处理流程 要点回顾 异常的处理流程 实验1:理解调试器与异常的关系 未处理异常:最后一道防线 实验2:理解UnhandledExceptionFilter执行流程 实 ...
- 软件调试学习笔记(三)—— 调试事件的处理
软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...
- 【软考中级】软件设计师学习笔记
软件设计师学习笔记 计算机系统知识 程序语言设计 数据结构 操作系统 软件工程基础知识 结构化开发方法 创建型设计模式 行为型设计模式 结构型设计模式: 算法设计与分析 数据库技术基础 网络与信息安全 ...
- 软件设计模式学习笔记(七)
软件设计模式学习笔记(七) 结构型模式 1. 组合模式 1.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构.在树形结构中可以通过调用某个方法 ...
- 软件设计模式学习笔记(三)
软件设计模式学习笔记(三) 1. 工厂设计模式 1.1 概述 需求:设计一个咖啡店点餐系统. 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡[AmericanCoffee]和拿铁咖啡[La ...
- 三代组装软件canu学习笔记
三代组装软件canu学习笔记 (2017-08-07 14:17:43) 转载▼ 分类: 三代 1:这个组装软件起源于PBcR包含在Celera Assembler中(http://wgs-ass ...
最新文章
- java金钱千分位处理_java对金额的处理,保留两位小数、千分位符
- docker 安装zookeeper集群
- fopen需要改写成fopen_s的时候
- 博士申请 | 香港科技大学谢知遥教授实验组招收机器学习全奖博士生
- servlce与filter的url-pattern介绍
- 快速排序 (随机选择pivot)
- 全球Top 1000计算机科学家h指数公布,中国顶尖计算机科学家人数进入前三
- java设计模式面试,深入分析
- 典型的php系统由什么组成,完整的计算机系统由什么组成
- 怎么用spss做冗余分析_【攻略】手把手教你怎么用SPSS做统计分析
- GB/T 18487电动汽车充电领域国家标准解析 篇一(充电术语和定义)
- Java 网络IO编程
- k8s集群管理(一)
- 我参加第七届NVIDIA Sky Hackathon——训练ASR模型
- LeetCode刷题第七天
- android表情符号不显示,微信分享页面Andriod手机emoji表情符无法显示问题?
- 【财富空间】计算机起源的数学思想
- 最后冲刺:第三届全国人工智能大赛决赛战报
- R语言rhdf5读写hdf5文件(.h5)展示文件组织结构和数据索引
- 遇到女神应该使用什么样的暗恋思维
热门文章
- linux安装intel无线网卡驱动,CentOS 命令行安装intel 2200bg无线网卡驱动
- 将图片公式快速转为word可编辑的方法(windows和mac都支持)
- notepad下载(官网进不去)
- android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment
- 如何破解私域留存?四大核心环节拆解锁客关键能力
- IDEA 2019 修改中文字体
- 全屏滚动插件之 fullpage.js
- 赠书!Python 安全攻防,终于来了!
- ultravnc中文版,5步教你如何进行ultravnc中文版配置
- 浅述不同版本ios系统有什么特点 ios 1 -ios 12