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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cheat engine 7.3 源码 CE7.3源码 添加暗模式支持(更改设置时重新启动 CE) 所有保存的结果现在显示在发现列表中(可以关闭) 组现在可以支持指点通配符。(只有当字段是适当的指点时才有效) 如果重复定时器尚未完成,可以通过释放密钥和抑制来重复热键 结构解剖添加到地址列表使用地址弦而不是数字,因此符号将被保留 结构解剖现在有一个选项来保存列的先前状态,并显示更易于更改 中鼠标单击现在将结构元素的值复制到剪贴板中 添加 [$LUACODE] 块用于内联 Lua 编码 向 CE 添加了 c 编译器 在自动装配器中添加 [$C] 块。所有 [$C] 方块在执行前合并成一个脚本 添加 [$CCODE] 内联 C 编码的方块 (检查论坛、维基、CE 帕特里翁不和谐或 CE 的 youtube) 添加了 C#编译器(编译器) 添加例程以进行。NET(和单体)方法绕道而行。.NET 信息有一个新的上下文, 您可以在那里为自动组装器创建一个绕行模板 将调用方法添加到 .NET 信息窗口 [禁用] 部分现在可以参考标签、定义、AOBScan 结果和在 [ENABLE] 部分创建的分配 用户定义的符号列表具有 CCode 符号的次要列表 更改地址窗口现在也支持相对偏移 DBVM 速度改进 DBVM 具有额外的安全级别,并添加了dbvm_setKeys,以便轻松更改访问代码 DBVM 现在有一些嵌套 VM 的基本支持 (只有这样你才能运行它们, 还没有修改) 新的调试界面:DBVM 级调试器 改进"查找此地址的访问/写入"性能 解剖代码现在允许您指定自定义范围 如果记录是字符串类型,则地址列表值排序现在按字母顺序对值进行排序 多个条目的下拉列表现在可以同时更改 独立注册窗口现在也显示标志值 如果第一个值大于第二个值,则扫描之间的值现在自动摇号顺序 修复: 修复一些游戏冻结 CE 时,符号访问 Lua 调试现在显示循环变量 几个窗口现在保存他们的位置, 不会被损坏, 如果你不显示他们第一次运行 Ce 使用超时时固定创建阅读和停止 固定拆解 vcvtsi2s 固定比较第一次扫描, 如果它是一个大块, 并使它更有效 切共享:注销已修复 固定组装模组 固定的 ultimap ret 过滤器 固定卢阿管从不呼叫奥纳罗尔 64 位 CE 中的固定 vehdebug 在 32 位目标中将 FPU 寄存器归零 固定 DBVM 查找 AMD 上的访问/写入点 使用单行编辑器时不处理内存记录的固定撤消 加载表时固定隐藏儿童组选项 在中断和跟踪窗口中修复了一些字体问题 固定粘贴六角视图中的其他类型 修复符号加载器完全崩溃在未知 pdb 符号数据 卢亚: 保存表不再要求在表上签名 如果省略按钮列表,消息对话将有效。(然后默认到 mbok) 添加更多自定义按钮 注册系统不再错误出整个脚本的失败。它现在覆盖现有符号 还有很多其他的事情。 新功能: 形式. 保存到流编译 () 编译 () 签名扩展签名表符号列表. 获取模态列表符号列表. 获取模拟列表 memscan. 获取保存的执行处理器 memscan. 获取保存的签名列表保存的处理器类

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值