
C/C++
noock
这个作者很懒,什么都没留下…
展开
-
Lua 5.4.4函数、模块注册
1. 函数注册Lua 5.4.4 变化比较大,从5.2后就变了static void my_fun(lua_State* lua) { const int arg1 = luaL_checkinteger(lua, 1); const char* str= luaL_checklstring(lua, 2, NULL); printf("%d : %s\r\n",arg1, str);}static const luaL_Reg DRIVERS[] = { {"my_fun", my_f原创 2022-04-04 00:01:19 · 1648 阅读 · 0 评论 -
程序员修炼必读清单(二)
4. 编程语言一个优秀程序员一定不是只掌握一门编程语言,每个语言都有它的优点,同时有它的缺点,无论是从语言本身还是从软件工程学角度来讲。可以这么说,一个优秀的程序员,可以不依赖于任何一门开发语言,并且可以选择多种开发语言实现复杂系统。2012年写过一篇好的程序员应该熟悉的几门编程语言,虽然现在语言有所发展,趋势有所变化,但大部分仍然是适用的。今天我们重拾旧题,一名优秀程序员应该熟悉以下几种编程语...原创 2020-03-22 00:01:12 · 839 阅读 · 0 评论 -
C语言编程中避免不必要错误的几点编程风格建议
1、定义变量的同时尽可能初始化变量 因为在C语言中变量定义后其值是不确定的,特别是指针如果不进行初始化可能无意中造成不确定内存的读写,在定义变量时尽量将其初始化,如果是变量有确定的初始值最好在定义时直接初始化,如果不确定则在定义变量时初始化为0,指针如里在初始化时没有确定的原创 2007-11-02 06:31:00 · 832 阅读 · 0 评论 -
QT交叉编译环境
1. 在QT Creator中交叉编译 1) 交叉编译QT Embeded 2) 设置QtVersion设置 点击Tools->Options->Qt4->Qt Versions. 然后添加已经编译的Qtembedded目录进去,就可以编译了。 在工程中的Release配置中,必须保证Qt Version是Qtembedded,也就是刚才新建的那个Qt Version Qt Creator默认是Default Qt version的。 这需要点击左边的Projects来修改。原创 2009-10-02 12:16:00 · 1215 阅读 · 0 评论 -
windows PSAPI.h 的一个BUG ?
想用windows PSAPI中的EnumPageFiles函数获取页面文件的列表及使用情况,查到在MSDN中的声明是这样的: BOOL WINAPI EnumPageFiles( __out PENUM_PAGE_CALLBACK pCallbackRoutine, __in LPVOID lpContext);看到第一个参数是__out,感觉非常奇怪,它要输出做什么用呢?想来应该是自己定义的一个函数,然后对每一个页面文件都调用该函数,因原创 2009-10-05 12:17:00 · 1739 阅读 · 0 评论 -
为什么要用C++之:命名空间
1.1.1. 为什么要命名空间(namespace) 对于一个大型的C语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块的一组函数名加个特定前缀,如HTRequest_setInternal、HTRequest_internal等。这使得程序员每次调用这些函数时都必须多输出一些字符,虽然使用现在比较优秀的IDE(Integrated Development Environment),不会给程序员的输入带来多少负责,但这些字符看起来还原创 2009-11-29 12:24:00 · 3585 阅读 · 3 评论 -
Why C++: 源文件与头文件有什么区别
1.1. 源代码文件与头文件有什么区别 C++的源代码文件分为两类:头文件(Header file)和源文件(Source code file)。头文件用于存放对类型定义、函数声明、全局变量声明等实体的声明,作为对外接口;而源程序文件存放类型的实现、函数体、全局变量定义。对于商业C++程序库,一般把头文件随二进制的库文件发布,而源代码保留。 一般情况下头文件常以.h或.hpp作为扩展名,而实现文件常以.cpp或.cc为扩展名。头文件一般不直接编译,一个源文件代表一个“编译单元”。在在编译一个源文件时,原创 2010-12-05 20:26:00 · 1801 阅读 · 1 评论 -
C++中的深复制与浅复制
在C#与Java的编程技术书中,关于赋值运算符经常会提到深复制与浅复制两个概念,因为C#与Java把对象分为两类:值类型和引用类型,而在C++中则没有明确这两个概念,其实在C++中的指针和引用都是引用类型的变量,C++标准库std::tr1::shared_ptr非常类似C#与Java中的引用变量,只有内置数据类型的变量才是值变量。既然在C++中也有值变量和引用变量,则在C++中也存在深复制与浅复制的问题。 图?: 深复制与浅复制 如图所示,当自定义的数据类型中存在由程序员维护的资源时,如在堆上原创 2010-05-03 12:30:00 · 1497 阅读 · 0 评论 -
C++中的sizeof操作符
1.1. sizeof操作符 sizeof操作符用于获得一个表达式的类型的大小,表达式可以是一个运算式、变量或类型,当sizeof后面是单个标识符时,不需要括号。如果sizeof表达式作为整个表达式的一部分时最好使用括号,除非你很清楚各运算符的优选级。sizeof的优先级是一元运算符中最低的,但高于所有二元运算符。使用sizeof获得C++内置类型的值可能为(不同CPU、不同编译器都可能不同): 数据类型原创 2010-05-24 12:50:00 · 1236 阅读 · 0 评论 -
C++中获取内置数据类型最大值、最小值的模板类
昨天使用两个函数模板来获取整形数的最大值最小值,但对符点数是不支持的,可以通过模板函数的特化来添加浮点数的值。但是函数调用是要消耗CPU时间的,虽然使用inline给了编译器提示,但只是提示而已,到底什么情况优化,优化的什么程度只有编译器自己知道。而且函数体内的那行代码会不会在编译期就计算出结果,这也完全取决于编译器。也就是说这两个函数的性能取决于编译器,而不被我们自己控制,这有点儿不太好,主动权应该掌握在我们自己手时,今天进行了重构,实现了一个模板类来解决这些问题,保证程序的效率可控而且高效。当然,这也是原创 2010-12-05 12:52:00 · 4154 阅读 · 0 评论 -
bool ischild = !!setjmp (grouped.ch.jmp);
cygwin源友事用到这么一句,两次求非的目的是什么呢?考虑可能如果直接用 bool ischild = setjmp (grouped.ch.jmp); 可能会出warning,因为这里有隐式的类型转换,我在GCC下试了一下也没有出现,而在VC下试了一下果然出现警告,而使用!!setjmp(…)则没有警告。原创 2009-05-24 12:12:00 · 682 阅读 · 0 评论 -
C++中模拟C#静态构造函数
在C#中有一个比较好的特性,就是静态构造函数,这样可以通过一个函数做一系列的全局初始化工作 ,而不需要让客户代码手动调用一个初始化函数,这样至少有两个好处:1)防止由于客户代码忘记调用一个初始化函数,从而忘对某此重要数据进行初始化;2)不需要客户代码中调用初始化函数,使模块代码更加独立,模块间耦合度更小。虽然C++没有明确说明支持该特性,但其实这种技术是可以通过简单的技巧模拟取得相同的效果,其示例代码如下: #include #include using namespace std; class原创 2009-05-15 12:10:00 · 987 阅读 · 0 评论 -
Visual Studio 中查看错误信息
添加一个Watch变量,变量名为 $err,hr 这样,执行WIN32 API时,就会显示GetLastError( )的返回值和对应的描述信息,相当方便。原创 2009-03-27 12:07:00 · 2857 阅读 · 0 评论 -
Keil C51 高效代码的几点建议
1、编译模式 Keil C51有三种编译模式:Large, Compact, Small模式,Large模式是把默认的变量都分配到外部存储空间,即xdata,通过DPTR访问,生成代码量最大,效率最低的模式;Small模式是把变量的默认位置分配在直接寻址的128字节空间中,原创 2005-12-21 06:47:00 · 2617 阅读 · 2 评论 -
在KEIL C51中使用串口的重要注意事项
问题:用计算机通过串行口发送数据到单片机,不连续发送或者每次发送数据不太大时单片机可以正常接收,但是连续发送大批数据之后就不能正常工作,确定硬件肯定没有任何问题,软件似乎没有问题 几经周折找到引发问题的代码所在 P3 = ((P3 & 0xC3) | (newV原创 2006-08-30 06:49:00 · 1891 阅读 · 0 评论 -
C语言编程艺术--C语言中Union类型与指针
在C语言中通过union数据类型可以方便地将不同的数据类型定义在同一段数据空间内,这样的用途可能用几个: 1)定义一个变量,在不同的场合当成不同的类型使用,两种场合没有任何联系,两次使用的值也没有任何联系; 2)定义一个变量,存储某一种多字节的数据类型,读取或者存取原创 2007-01-10 06:51:00 · 2911 阅读 · 0 评论 -
C语言中的常量指针和指针常量
关于常量指针和指针常量已经试着记过好几次了,平时用得也不多,老是记不住,两个总给搞混了,今天在华为面试又问到这个问题,真的应该把它整理清楚了。 定义 : const char* pa; 或 char const *pa;这样定义的pa称为常量指针,原创 2008-03-02 09:22:00 · 4239 阅读 · 0 评论 -
使用std::tr1::function对象代替虑函数
在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. >. Item 35.下面具体说明其使原创 2008-06-03 09:40:00 · 1147 阅读 · 0 评论 -
Windows系统异常处理
在C++中使用try/catch不能捕捉操作系统抛出的异常,如非法地址访问、浮点异常等,而使用VC中的扩展特性__try/__except和__try/__finally可以捕捉这类异常.如: int Func(int i) { int z=0;原创 2008-06-26 09:47:00 · 2432 阅读 · 0 评论 -
C++ Null Object模式在DLL中导出失败的困惑
写了个Timestamp的类,想使用Null Object模式表示空值,用于函数返回值,在tstamp.h文件中定义如下: class __declspec(dllexport) Timestamp { .... public:原创 2008-08-12 11:45:00 · 782 阅读 · 0 评论 -
C++ 使用成员函数指针的一个例子
进行单元测试,要测试一个类的功能,下面这个测试类一共有三部分功能测试,每种测试分别在一个函数中完成,然后可以通过键盘输入控制测试模块是否运行。开始代码写成这样 class PendulumTest{public: PendulumTest(void); ~PendulumTest(void); void TestHardware( void ); void TestDiscreteModel( void ); void TestInterface( void);原创 2009-03-02 12:02:00 · 858 阅读 · 0 评论 -
C++ ostream与printf比较
这两天与一位网友就C++流与printf函数的问题吵了两天,有点儿火药味儿(http://www.cppblog.com/converse/archive/2010/07/06/119427.html),其实我是对他一个大标题“C++的流设计很糟糕”,是比较生气的,这么多年还没有谁敢对C++的标准库如此出言不逊。我还使用百度跟GOOGLE验证了这一点,把“C++ 流 糟糕”三个关键词放在一起,GOOGLE与百度出奇一致的结果就是头条就是上面链接那博文了。 C++标准库,可以说为了保证其通用性和效率,真原创 2010-07-09 12:58:00 · 3270 阅读 · 0 评论 -
一个C++数组指针的例子
代码: #include using namespace std; int a[3][3]={{1,2,3},{2,3,4},{3,4,5}}; int b[3][3]={{2,2,3},{3,4,5},{4,5,6}}; int c[3][3]={{3,2,3},{3,4,5},{4,5,6}}; int main( int argc, char* argv[]) { int (*arr[])[3][3] = {&a, &b, &c}; for原创 2009-10-11 12:20:00 · 1130 阅读 · 0 评论 -
由C++中的自增、自减运算符引发的思考
今天看到优快云上又有初学C++的朋友问到C++中自增、自减运算符前缀、后缀形式的运算符使用的问题,觉得这个问题很普遍的,应该问到的挺多的,这么多年在考试题、面试题中几乎是个必考的问题,先不去说相关的知识点,我就想看一下关于这个问题讨论的现状,结果发现很多人讨论得还挺“深入”。 比如: int n=0, m=0; i= (n++)+(n++)+(n++); j = (++m)+(++m)+(++m) k=-i++; 后缀运算: (1)j=(5,6,(i++)+(i++)+原创 2011-04-17 23:11:00 · 1306 阅读 · 0 评论 -
都是visual studio 2010 BUG惹的祸
这两天项目在用C#调用C++编写的一些库时遇到一个很头痛的问题,用C++对DLL进行测试没有任何问题,可用C#进行调用时居然所有输出参数均未被改变,也就是输出没有任何输出,但返回值是正确的。同事调了两天,曾怀疑是函数调用约定问题,于是不断地在__cdecl和__stdcall的各原创 2011-09-15 22:46:46 · 1759 阅读 · 0 评论 -
C#调用C/C++ 动态链接库DLL(二)
此次示例包含了常用类型参数的转换及传递包括1) 基本类型:int, unsigned char, float, double等2) 指针类型;3) 引用4) 一维数组、二维数组5) 简单结构体6) 结构体中包含数组7) 字符串类型8) bool类型后续再进行其它 类型的封装,如9) 函数指针与回调函数10) 类下面结合代码对这些类型原创 2012-06-24 15:02:36 · 5232 阅读 · 1 评论 -
C#调用C/C++ 动态链接库DLL(四) -- 调用C++类
对于在C#中调用C++类的情况比较复杂,至少有三种情况,见下文的Introduction部分,并详细讲述了P/Invoke以下内容转自:http://www.codeproject.com/Articles/14180/Using-Unmanaged-C-Libraries-DLLs-in-NET-Applicatio1. IntroductionThis arti转载 2012-06-24 16:14:29 · 6600 阅读 · 1 评论 -
C#调用C/C++ 动态链接库DLL(一)
在一些应用系统中经常会用到C#调用C++的一些代码,特别是结构体、指针、引用等类型的传递。总结一下常用的一些类型传递。官方关于C#与C++互操作的文档http://msdn.microsoft.com/en-us/library/ms173184.aspx,官方的一个例子:http://msdn.microsoft.com/en-us/library/ms173187.aspx。1。原创 2012-06-24 14:53:26 · 5155 阅读 · 0 评论 -
C#调用C/C++ 动态链接库DLL(三)
2。 在C#中创建DLL接口的声明C#没有全局函数,必须使用静态函数实现全局函数。1) DllImport类似C++中的__declspec(dllimport),第一个参数为必选参数,为DLL的路径,一般以相对路径即可,只需要将DLL文件放到工作目录中即可2) EntryPoint表示对应的函数名称,这个与C++ DLL工程中.def文件中导出的函数名同使用C#调用C++时不支原创 2012-06-24 15:24:11 · 17878 阅读 · 0 评论 -
整数运算实现四舍五入
在进行除法运算时难免会遇到四舍五入的问题,如果使用整数运算可能误差较大,因为纯整数运算会把整数部分全舍去,如果使用浮点运算,则会增加运算量,特别是运算量比较大的算法中或在移动设备和移动设备这些资源比较紧张的应用上,这种开销是值得考虑的。下面代码就是使用整数运算实现四舍五入的一个例子c = (b + (a >> 1)) / a;这里a >> 1就是a的一半,这样就像当于只要b/a的余数大原创 2012-07-15 16:44:22 · 3575 阅读 · 0 评论 -
对异常处理的三种方法比较
当调用某个函数、在函数中进行参数验证或对动态分配的内存进行处理主要有三种手段: 1) 硬编码(hard code) 2) 使用断言(Assert) 3) 使用异常(Exception) 这三种方法各有好处,在不同的场合可以使用不同的方法,可以根据侧重点的不同选择适合的方法进行异常处理。下面以对一个链表处理函数的参数验证为例,讨论并比较三种方法。假设有一个函数要处理一个链表。原创 2008-06-10 09:42:00 · 1943 阅读 · 0 评论 -
C++ 模拟C#/Java中的检举(enum)类型
在C++中enum类型仅仅相当于一系列的整数常量,如果要在日志中显示或标准输出打印时需要把整数与一个字符串对应起来,从配置文件中读取时为了配置文件的可读性最好配置的是字符串名称而不是数字,使用enum类型很不方便,而在C#和Java中都可以方便地使用enum类型的toString方法转换成字符串,或使用parse方法来从字符串转换为对应的enum类型。但我们可以使用类来实现类似C#的enum类型,使用其静态成员变量来代替各enum的各值,再增加相应的方法即可,例如实现一个表示一周各天的类: cla原创 2011-04-11 15:06:00 · 1588 阅读 · 0 评论 -
C++监测内存泄漏(一)
C++内存泄漏一直是让软件工程师头痛的问题,因为内存的泄漏可能最终导致系统内存耗尽而崩溃。今天想到一个方法来跟踪与控制对象的分配,原理就是在构造函数中检测该对象是在堆上分配还是在栈上分配的,如果是在栈上分配的当然不用管它,离开作用域会被自动销毁,我们只需要跟踪椎上创建的对象。 最关键的问题是如何判断对象是在堆上还是在栈上创建的呢?我们可以通过对象所在的位置,也就是this指针的值来检测是在堆的区域还是在栈的区域。一般的,操作系统会为静态存储区、堆、栈分别分配几块空间,而且这几块原创 2011-04-06 17:57:00 · 1852 阅读 · 0 评论 -
C++中检测整数类型的最大、最小值
由于time_t底层类型根据编译器不同其最大值是不同的,由于程序中用到其最大值,故而想手某种手段检测其极值,下面是使用模板函数检测的代码。 当然也可以定义为宏,或者将其定义为常量。如果定义为常量就不能检测用户自定义类型的最大最小值,使用宏或者模板支持用户自定义类型。 遗憾的是在C++98中还没有办法自动获取变量的类型,等C++0X一发布,这个函数就可以用一个变量作为参数,然后就可以获得某个变量可能的最大值与最小值, 会使这两个函数模板更有用。 #include #include usin原创 2010-06-07 12:52:00 · 3279 阅读 · 0 评论 -
软件设计中的模式
设计模式被认为是面向对象技术的第二代技术,公认的主要有设计模式(design patterns)、反模式(anti-patterns)、实现模式(implementation patterns)。这三方面都有标志性的书籍 Gof 的 “Design Patterns” William J. Brown, et al. “AntiPatterns” Kent Beck. “Implementation Patterns” 这三种模式涉及到软件设计的方方面面,而且侧重点也不一样,设计模式侧重于原创 2010-06-20 12:54:00 · 929 阅读 · 0 评论 -
如何学好C++
“如何学好C++“,在各种论坛不知道见过多少遍了,也听不少师弟师妹们过过多少遍了,但这个问题没有标准答案,我真的希望有。但我还是想把自己的想法写下来,把近十年来学习、使用C++的一些感觉写下来与朋友们分享,也希望对一些初学者有用,一家之言尔。 1、认识C++、端正态度 首先,要问“如何学好C++”这个问题之前,必须先审问一下自己,“真的想把C++学好吗?”当然,问这个问题的人多数还是真的想把C++学好的,那么首先我们必须先正视C++,要正视其难度,我们要先认识C++。原创 2011-01-01 23:50:00 · 2965 阅读 · 2 评论 -
腾讯的一道面试题
假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效。 这里讨论正热呢: http://topic.youkuaiyun.com/u/20110110/17/dcdb6234-842b-48be-a286-6ffb5b2534f4.html 闲着没事儿,也写了段儿程序 #include #include using namespace std; static原创 2011-01-22 21:56:00 · 1444 阅读 · 1 评论 -
返回值为C/C++函数指针的函数
今天一朋友问到我这么一个函数,感觉很怪异,看是什么意思: inline void (*cast_to_fptr(void *p))(){ union{ void *p; void (*f)(); }u; u.p = p; return u.f;}看起来是挺怪异,其实改造一下就很明显了: typedef void(*function_t)();inline function_t cast_to_fptr( voi原创 2011-03-02 22:11:00 · 1952 阅读 · 0 评论 -
C++中extern的用法
1. 声明外部实体 声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern是必须的,省略了extern编译器将视为定义而不是声明,一般地在源代码中定义变量并进行初始化,在头文件中使用extern声明变量。 类似地用于声明外部全局函数,表示该函数在其它编译单元中定义,如: extern void func( void ); 此时的extern可以省略。 2. 声明函数的编译和链接方式原创 2011-02-20 17:51:00 · 12525 阅读 · 0 评论 -
C++中struct与class的区别
很多初学者或者是想当然,或者是被网上的一些错误信息给误导,面试中问到class和struct区别时经常会说class可以继承而struct不可以继承,这是完全错误的。但在C#中,class与struct确实有这点区别(当然不止这一点)。其实,在C++中,这两个关键词并没有大的区别,仅在细节上有些不同。 1。 字面上的区别 在字面上struct是structure的缩写,通常叫做“结构体”,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关键字,并原创 2011-02-19 22:29:00 · 17166 阅读 · 0 评论