您正在查看 "技术" 分类下的文章
2008-10-18 23:17
大家看下面这段代码,输出结果会是怎样?
#include <iostream>
using namespace std;
enum eTest
{
a1=1,
a2,
a3 = 5,
a4,
a5 = 6
};
int main()
{
cout << a1 << a2 << a3 << a4 << a5 << endl;
return 0;
}
测试可以发现,输出结果为:12566。
元素a4和a5的值相同,也就是说枚举各元素值可以相同,并未要求值唯一。
|
2008-10-16 00:50
问:如何用信号在Linux进程间传递大数据?
答:这个问题我也想过,不过实在愚钝,最后我思考得出的结果是信号不能在进程间传递大数据。
分析如下:
信号只能传四字节,要是是四字节大小的数据,要么是数据的指针。
对于不同的进程,相互之间的内存是独立的,因此传一个指针是没有任何实际意义的。因此,我认为进程间是不能用信号传递大数据的。必须使用其他方法如管道、文件或共享内存才能实现。
以上是我的个人分析,要是错了,望过往高手指出。 |
2008-10-06 22:22
问:为什么要对全局资源的操作进行封装,有什么好处?
答:对全局资源的访问风险是很高的。全局资源相对于一个隐形的输出参数,对其的访问产生的影响很容易被Coder忽略,而进行封装后可以限制其受访问范围,使全局资源更加可控。 |
2008-10-05 23:03
问:我看到很多宏函数使用do-while(0)的形式来定义,有什么好处?
答:使用do-while(0)定义宏函数可以很好的控制代码处理流程,在需要退出处理时直接使用Break跳出即可。这是普通宏函数所无法做到的。 |
2008-10-05 22:58
问:调用relloc函数重新分配内存失败后会释放原有内存吗?
答:不会,relloc失败后,之前的内存需要自己释放,否则将导致内存泄漏。
样例:
#include "stdlib.h"
const int Orisize = 512;
const int ReSize = 1024;
int main()
{
char *pOriMem = NULL;
char *pReMem = NULL;
/* 申请内存 */
pOriMem = malloc (Orisize);
|
2008-07-31 15:03
用++i代替i++,用inline函数代替宏函数,用const变量代替宏变量。
书上讲,嘴上说,但最后还不是按老样子来了?
习惯的力量是可怕的,历史遗留下来的东西是很难改变的。
程序员是一群既勤快又懒惰的人。 |
2008-07-18 09:08
错误用法:
#define TEST_MACRO (a, b) (a*b) | \
(a+b)
上面这个宏,表面看没什么问题,但却已是千疮百孔。
Err1:TEST_MACRO后面不能有空格;
Err2:"\"后面不能有空格;
Err3:参数a与b需要用括号括起来;
正确用法:
#define TEST_MACRO(a, |
2008-07-04 21:19
一个典型的C语言软件,通常会包含类似下面这样的头文件:
//test_def.h 宏定义头文件
//test_type.h 数据结构定义头文件
//test.var.h 全部变量头文件
假设这几个头文件中的数据定义存在如下引用关系:
//test_def.h
#define TEST_INFO_ID_MAX 10
#define TEST_GET_INFO_BY_ID(ulInfoID) ((TEST_INFO_S *) (g_pstTESTInfo[(ulInfoID)]))
//test_type.h
typedef struct tagTEST_Info
{
int iInfoID; |
2008-07-03 21:25
首先声明,简单的头文件重复包含问题不在此文的讨论范围之内,此问题可以通过下面的文件格式进行解决。
#ifndef __filename_h__
#define __filename_h__
/* code */
#endif
我们这里讨论的头文件互相包含是文件中的内容有互相引用的情况。比如test_a.h文件中定义了结构体TEST_A_S,test_b.h文件中定义了结构体TEST_B_S,且TEST_A_S引用了TEST_B_S,同时TEST_B_S也引用了TEST_A_S。
此问题的本质就是结构体的互相引用,下面我们对结构体互相引用的问题进行分析,而对于头文件互相包含 |
2008-04-13 11:07
今天有个网友发消息问了我一个问题,基本上是下面这样一个情况。
作者写了一个C++的程序,如下:
#include <iostream.h>
typedef struct node
{
int a;
double b;
} NODE_S;
main ()
{
cout<<sizeof(NODE_S)<<endl; //输出16
cout<<sizeof(int)+sizeof(double)<<endl; //输出12
|
2008-03-24 16:11
NAS项目结束,POSA项目正式开工。
POS:Point of sale,销售终端。
POSA:POS access,POS接入。
少说话,说有用的话;
多做事,做有意义的事。 |
2008-03-19 21:54
---------------------------------------------------
注:以下为C语言经典书籍推荐
---------------------------------------------------
一、The C Programming Language
C程序设计语言
出版社: 机械工业出版社
原出版社: Prentice Hall PTR
作者: [美]Brian W.Kernighan,Dennis M.Ritchie
译者: 徐宝文 李志
二、Pointers on C
C和指针
出版社: 人民邮电出版社
原出版社: Pearson Education
作者: Kenneth A.Reek
译者: 徐波
三、Expert C Program |
2008-03-14 17:26
今天队友在系统测试的时候,不小心发现了一个问题:我的Mail进程CPU占有率高达90%。
问题十分严重,肯定是程序出了问题,不用多想,马上定位。仔细分析了一下:首先我的程
序并不复杂,系统开销不会太大,至少不会达到占用90%的地步,那什么情况下CPU占用会到这种境界呢?
经过一段时间的分析和定位,问题得到了解决,于是抽出时间,写下这篇文章。
首先说一下什么叫做空死循环,因为这是我自己取的名字,所以我想有必要先解释一下。
空死循环即"在循环体内部什么都不做的死循环"。
|
2008-03-12 11:02
前期一直忙于NAS-Mail的开发,在开发的过程中,走了很多弯路,也积累了一些经验。
这篇文章将告诉你,要进行SMTP邮件系统的基本开发,需要准备哪些基本理论知识。如果你正在或即将进行这方面的工作,或者这篇简短的文章能对你有所帮助。
1. SMTP协议
必读协议:RFC821、RFC2554
a) RFC821是SMTP协议的主体,实现了SMTP通信的基本模型,并规定了基本的命令语法。
c) RFC2554是SMTP协议的补充协议,主要是在RFC821的基础上加入了安全认证机制,增加AUTH命令用于SMTP交互时的用户名密码身份验证。
|
2008-03-07 14:31
内存的释放需要注意两点:
1. 为了防止内存的重释放(double free),最好在内存释放之前判断传入的指针是否为空;
2. 为了防止释放后的内存指针还在被别的程序使用,最好在内存释放之后将指针置为空。
这就是我说的安全释放内存的具体含义。
可以使用下面的函数或者宏来重新封装我们的free函数,进而达到安全释放内存的作用,
推荐使用宏来实现。
/* 安全释放内存的函数 */
void safefree (void *x)
{
if (NULL != x)
{
|
|
|