c/c++学习
文章平均质量分 65
gjw198276
这个作者很懒,什么都没留下…
展开
-
Message Queuing(MSMQ)学习之旅(二)——创建Queue
1.前言应用程序创建的Queue根据你是否希望被其他程序找到可分为Public Queue和Private Queue,Public Queue会在directory service中注册,有利于长时间的使用。Private Queue在本机注册,而不在directory service中注册,它一般通过在%windir%\System32\MSMQ\Storage\Lqs下存储相应的描叙原创 2013-03-18 16:02:13 · 3430 阅读 · 0 评论 -
基本数据类型小议
1. 整型只有四类:short, int, long, long long. 在int和short/long的组合中,int被忽略。其它的组合被视为非法。如 short int x 等价于 int short x 等价于 short. long int x 等价于 int long x 等价于 long. long int long转载 2008-02-05 10:28:00 · 712 阅读 · 0 评论 -
匿名namespace的作用以及它与static的区别
一。匿名namespace的作用 在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做 为函数名或者全局变量名,则在链接阶段就会发生重定义错误,为了解决这个 问题,我们可以在定义这些标识符(identifier)的时候加上static关键字修 饰以限制它只在一个tu范围内可见。 C++继承了C语言中static关键字的这个用途,我们依旧可以使用static来避免转载 2008-02-04 18:28:00 · 908 阅读 · 0 评论 -
T a(v);和T a = v;的区别
本文所说的类型T均指UDT,非built-in类型 构造一个对象,有如下三种形式: 1。T a; 这个没什么好说的,调用default ctor来构造a 不过要注意的是,要么T就一个ctor也没有,编译器合成default ctor,即T::T() 如果T有手动添加的其他形式的ctor,但是没有T::T(),则此语句报错,因为编译器不再 为T合成default ctor *注1,如果没有def转载 2008-02-04 14:06:00 · 4690 阅读 · 0 评论 -
C/C++的左值和右值
0 左值性(lvalueness)在C/C++中是表达式的一个重要属性。只有通过一个左值表达式才能 来引用及更改一个对象(object)的值。(某些情况下,右值表达式也能引用(refer)到某一 个对象,并且可能间接修改该对象的值,后述)。 何谓对象?如果没有明确说明,这里说的对象,和狭义的类/对象(class/object)相比, 更为广泛。在C/C++中,所谓的对象指的是执行环境转载 2008-02-04 11:59:00 · 1657 阅读 · 1 评论 -
C/C++中的序列点(待读)
0. 什么是副作用(side effects) C99定义如下 Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes i转载 2008-02-04 00:04:00 · 954 阅读 · 0 评论 -
二维数组new小结
1. A (*ga)[n] = new A[m][n]; ... delete []ga; 缺点:n必须是已知 优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用) 2. A** ga = new A*[m]; for(int i = 0; i ga[i] = new A[n]; ... for(int i =转载 2008-02-03 23:09:00 · 612 阅读 · 0 评论 -
模板特化降低代码膨胀
以下内容根据TC++PL 13.5 Specialization一节。 考虑定义了模板Vector之后,我们可以定义 Vector Vecotr Vector 等。 Vector的所有操作,对int *, char *等各种类型都要生成一份代码, 例如Vector::swap(),最终代码里就会有Vector::swap(转载 2008-02-03 21:56:00 · 1028 阅读 · 0 评论 -
new的六种重载形式
当写出 p = new P(); 这样的代码的时候, 实际上有两步操作, 首先分配内存, 然后在分配好的内存之上初始化类成员. 第二步是有构造函数完成的, 第一步就是new函数的工作. 全局的new有六种重载形式, void *operator new(std::size_t count) throw(std::bad_alloc); //一般的版本 voi转载 2008-02-03 21:42:00 · 1257 阅读 · 0 评论 -
C++namespace的使用
C++的namespace应用的几种基本方式 1.限定方式:如,mynamespace::BTreeNode 2.完全暴露方式:如,using namespace mynamespace,该方式将mynamespace的全部暴露 在全局空间 3.声明方式:如,using mynamespace::BTreeNode,这样避免把其他并不需要的内容 也暴露在全局空间,造成“空间污染” 4.别名转载 2008-02-03 21:34:00 · 1737 阅读 · 1 评论 -
C++辨析
C++辨析系列谈 ·郑力群·yesky static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下 面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质 。 static 的两大作用: 一、控制存储方式: static被引入以告知编译器转载 2008-02-05 15:08:00 · 642 阅读 · 0 评论 -
const volatile的使用
volatile修饰符告诉complier变量值可以以任何不被程序明确指明的方式改变,最常见的例子就是外部端口的值,它的变化可以不用程序内的任何赋值语句就有可能改变的,这种变量就可以用volatile来修饰,complier不会优化掉它。 const修饰的变量在程序里面是不能改变的,但是可以被程序外的东西修改,就象上面说的外部端口的值,如果仅仅使用const,有可能complier会优化掉这些变转载 2008-02-04 23:32:00 · 694 阅读 · 0 评论 -
关于inline的误解
误解:inline函数没有单独的函数体,也不能取地址。 inline修饰并不会改变函数的通常语义,仍可通过函数指针调用: inline void f() {} void g() { void (*p)() = f; p(); } ------------------------------------------------------------------------ 误转载 2008-02-03 09:37:00 · 651 阅读 · 0 评论 -
用streambuf简单封装socket
C++的I/O流是很强大的. 一方面在于易于使用, 类型安全. 另一方面在于容易扩展. 前几天尝试了一下用streambuf来封装客户端使用的socket. 虽然代码运行正确, 自己 的概念确实很模糊. 今天下回来cuj的光盘, 浏览了一下其中一篇也是关于使用stream来 封装socket的文章, 发现作者的概念也不比我清楚到哪里去. ;-) 先考虑一下最后客户代码的写法, 我希望是这样转载 2008-02-01 18:23:00 · 3861 阅读 · 4 评论 -
#progma的各种用法
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每 个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每 个编译器都是不同的。 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数转载 2008-01-29 20:14:00 · 634 阅读 · 0 评论 -
一点 C 的小题目
关于接口设计的。 : 如果是我面试,可能会出这样的题目,哈哈。 : : 1. : char* strchr(const char* str, int c); : 函数返回 str 中第一次出现 c 的位置,传入的是不可修改的 const char*, : 为何返回的却是可修改的 char* ? 因为要考虑实参是 char* 和 const char* 两种情况。 char* 做参数调用的时候,转载 2008-01-30 15:54:00 · 430 阅读 · 0 评论 -
Message Queuing(MSMQ)学习之旅(一)——基本概念
1.MSMQ是什么?(来源:百度百科)Message Queue(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地原创 2013-03-18 13:41:09 · 2615 阅读 · 0 评论 -
Message Queuing (MSMQ)
Message Queuing (MSMQ) technology enables applications running at different times to communicate across heterogeneous(多种多样的) networks and systems that may be temporarily offline. Applications send mes转载 2013-03-11 11:12:50 · 2214 阅读 · 0 评论 -
float类型和double类型的二进制存储
在32位环境下, float占用32位,double占用64位,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和 尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位 阶码原创 2011-11-10 16:01:45 · 23225 阅读 · 5 评论 -
VC++动态链接库(DLL)编程深入浅出(zz)
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使 用DLL,转载 2008-07-09 13:24:00 · 1089 阅读 · 1 评论 -
关于引用的总结
1. 什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据转载 2008-01-04 22:47:00 · 722 阅读 · 0 评论 -
readonly vs. const [C#]
Features: readonly和const都是用来标识常量的[1]。 const可用于修饰class的field或者一个局部变量(local variable);而readonly仅仅用于修饰class的field。 const常量的值必定在编译时就已明确并且恒定的;而readonly常量却有一点不同,那就是其值可以在运行时编译,当然,它也必须遵守作为常转载 2008-01-02 09:48:00 · 558 阅读 · 0 评论 -
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数 时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该转载 2008-01-01 19:12:00 · 648 阅读 · 0 评论 -
进程间通信的方式
共享内存, 管道 ,Socket ,消息队列 , DDE转载 2008-01-01 13:26:00 · 430 阅读 · 0 评论 -
c++的经典书籍
讲一下我的经验。 首先,关于入门书方面,我觉得到现在我都没有看到一部适合初学者的 C++ 入门书。经典的书都是高手们写的,但根本不适合初学者看。这大概 是 C++ 族群增长的一大瓶颈。 我个人觉得最适合入门的一本书是「从 C 到 C++ 物件导向革命」,当 然光看书名大家就猜到这是台湾的书了。它是 1990 年的书,作者陈建维 先生是当时 C++ 标准委员会的一员。这本书我觉得相当不错,用不转载 2008-02-02 15:05:00 · 785 阅读 · 0 评论 -
如何用宏生成动态二维数组
#define matrix_allocate(matrix, width, height, TYPE) {/ matrix = new TYPE* [height];/ for(int _i = 0; _i matrix[_i] = new TYPE[width];/}#define matrix_delete(matrix, width, height){/ for(int _i = 0;转载 2008-02-01 16:29:00 · 913 阅读 · 0 评论 -
如何看 VC 编译出的汇编代码
在VC6.下 Project setting中 工程类型选Release C++属性页中,分类下拉框选General,调试信息选Program database Link属性页中,分类也选General,选中General Debug Information. 调试的时候点击View->Debug Window->Disassembly选单项,就可以在汇编级别调试 可以看到优化的效果 还有就是看转载 2008-02-01 15:46:00 · 1415 阅读 · 0 评论 -
编程修养
什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对于速度快,只要编得多也就熟能生巧了。 我认为好的程序员应该有以下几方面的素质: 1、有专研精神,勤学善问、举一反三。 2、积极向上的态度,有创造性思维。 3、与人积极交流沟通的能力,有团队精神。 4、谦虚谨慎,戒骄戒燥。转载 2008-01-31 19:29:00 · 543 阅读 · 0 评论 -
指针详解
指 针 作者:jacky 第一章。指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。 让 我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**p转载 2008-02-01 10:34:00 · 553 阅读 · 0 评论 -
C之诡谲
从研究生二年纪开始学习计算机也差不多两年了,一路走来,有很多的收获,也有不少 的遗憾,现在正好有一段闲暇,就想对走过的路留下一些足迹,回忆。每个人都有自己不同 的人生,说到这里,就是程序人生了,歌德在《浮士德》中说过:“如果不曾在悲哀中咀 嚼过面包,不曾在哭泣中等待过明天,这样的人就不知道你——天的力量。”所以我想记 下一些带给我悲哀,带给我哭泣的程序人生。其实学习计算机的基础课程是非常重转载 2008-02-01 08:59:00 · 924 阅读 · 1 评论 -
如何在程序中找到何处在不断占用内存
一个简单而有效的方案: 分配的时候多分配一点空间作头,记下分配的文件名和行号,把所有的头连成一个环形双 链表,释放的时候从双链表中删除,并释放头。 结束的时候只要检查这个双链表是否唯恐就知道哪里泄漏内存了 在Windows DDK里的简化代码: in xxx.h // the real heap function void* sys_malloc(size_t size); void s转载 2008-01-31 21:20:00 · 822 阅读 · 0 评论 -
GNUmake 初步介绍
大家刚开始学习编程的时候,比较典型的是c程序编程。相信很多人都只使用单文件,也就是所有的函数都放在一个文件里面。估计很多人都有过这种感觉(特别是 使用谭浩强的《c语言设计》入门的时候)好像头文件什么用处也没有,大可以把头文件的东西放到c文件的开头。这样像头文件的如下定义很多人就无法理解是做 什么的了。 #ifndef _xxx_h_ #define _xxx_h_ //do something转载 2008-01-30 13:21:00 · 1486 阅读 · 0 评论 -
binary和text方式打开文件的区别
Request.ServerVariables("Url") 返回服务器地址Request.ServerVariables("Path_Info") 客户端提供的路径信息Request.ServerVariables("Appl_Physical_Path") 与应用程序元数据库路径相应的物理路径Request.ServerVariables("Path_Translated") 通过转载 2008-01-29 15:15:00 · 749 阅读 · 0 评论 -
open,fopen对二进制文件的操作
不带f的是系统调用,带f的是ANSI C标准函数 前者直接进入内核的 后者其实是对相应系统调用的包装 效率的问题嘛,不带f需要自己指定size来保证最佳效率 带f的用了缓存来保证效率 具体参考APUE相应章节转载 2008-01-29 13:06:00 · 964 阅读 · 0 评论 -
回车和换行
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换转载 2008-01-29 13:01:00 · 472 阅读 · 0 评论 -
C++编程规范之编程风格(读书笔记)
第14条 宁要编译时和连接时错误,也不要运行时错误。摘要能够在编译时做的事情,就不要推迟到运行时:编写代码时,应该在编译期间使用编译器检查不变式(invariant),而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下能够获得更高的可信度。讨论C++语言中提供了强大的静态检查功能,而对自动运行时检原创 2007-05-02 09:47:00 · 795 阅读 · 0 评论 -
C++编程规范之类型安全(读书笔记)
第90条 避免使用类型分支,多使用多态第91条 依赖类型,而非其表示方式摘要:不要对对象在内存中的准确表示方式做任何假设,相反,应该让类型决定如何在内存中读写其对象第92条 避免使用reinterpret_cast 第93条 避免对指针使用static_cast第94条 避免强制转换const第95条 不要使用C风格的强制转换第96条 不要对非POD进行memcpy操作或者原创 2007-05-03 15:58:00 · 1205 阅读 · 0 评论 -
C++编程规范之stl算法(读书笔记)
第83条 使用带检查的STL实现摘要:安全第一,大多数带检查的stl都会通过在容器和迭代器中添加附加的调试和支持信息来自动的检查这些错误。第84条 用算法调用代替手工编写的循环第85条 使用正确的STL查找算法第86条 使用正确的STL排序算法 摘要:理解每个排序算法的作用,选择能够实现所需而开销最低的算法。第87条 使谓词成为纯函数第88条 算法和比较器的参数应多用函数对象少原创 2007-05-03 15:52:00 · 889 阅读 · 0 评论 -
C++编程规范之stl容器(读书笔记)
第76条 默认时使用vector。否则,选择其他合适的容器第77条 用vector和string代替数组摘要:有助于编写更安全,伸缩性更好的软件第78条 使用vector(和string::c_str)与非C++ API交换数据摘要:vector和string::c_str是与非c++ api通信的通道,但是不要将迭代器当作指针,要获取vector::iterator iter所引用的元素原创 2007-05-03 15:42:00 · 763 阅读 · 0 评论 -
C++编程规范之名字空间与模块(读书笔记)
第57条 将类型及其非成员函数接口置于同一名字空间中摘要:如果要将非成员函数设计成类X的接口的一部分,那么就必须在与X相同的名字空间中定义它们,以便正确调用。第58条 应该将类型和函数分别置于不同的名字空间中,除非有意想让它们一起工作第59条 不要在头文件中或者#include之前编写名字空间using第60条 要避免在不同的模块中分配和释放内存第61条 不要在头文件中定义具有链接原创 2007-05-02 20:08:00 · 674 阅读 · 0 评论