C/C++
小_黄_人
/闲来无事写博客/
展开
-
聊聊“extern”关键字
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。作用见下: 1,在C++中extern的作用,用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名原创 2014-04-16 17:26:05 · 592 阅读 · 0 评论 -
拒绝编译器自动生成的函数
编译器自动的函数:默认构造函数析构函数拷贝构造函数赋值构造函数(operator =)有些场景中需要拒绝这些编译器自动生成的函数,可以通过下列方法,定义Uncopyable类并继承它。 拒绝使用编译器生成的函数:class Uncopyable{ protected: //允许derived对象析构 Uncopyable(){}; ~Un原创 2016-08-18 00:50:31 · 478 阅读 · 0 评论 -
位图排序
位图排序的前提条件:输入数据限制在较小的范围内;数据没有重复;每条数据单一,没有关联数据位图排序的三个步骤:将所有位初始为0;读入整数建立集合,将每个整数的对应位置为1;检验每一位,如果该位为1,就输出对应的整数,由此可得有序的输出。实现:#include <vector>#include <iostream>//template <typename Type>class Bi原创 2016-08-17 19:22:16 · 426 阅读 · 0 评论 -
socket小实例
时间服务器timerserver.c 客户端timerclient.c 在客户端输入服务器的地址,获取时间信息: 服务器端是一个死循环,当结束服务器进程时使用了’CTRL+C’,再次运行时出现如下情况发生: socket隐患:地址使用错误(EADDRINUSE)。 bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(b原创 2015-12-25 14:02:25 · 361 阅读 · 0 评论 -
getpeername
server端的代码: client端代码: 编译完成后先启动server,在启动client。 服务器端输出: getpeername函数取得与套接字相连的对端主机名原创 2016-01-09 15:30:31 · 913 阅读 · 0 评论 -
C语言memcpy函数的一点疑惑
结果: 如果结构体中存在指针变量,memcpy只是实现“浅层复制”,只复制了指针,没有对指针内容实现复制。原创 2015-12-24 18:29:41 · 827 阅读 · 0 评论 -
fgets函数规范的字符串输入函数
今天在写测试代码时,使用了gets函数来获取输入的字符串,结果出现了异常警告: gets函数危险的地方在于:它不知道缓冲区有多大,它会一直读取数据放到缓冲区,直到出现换行符(’\n’)或者遇到EOF才会停止。这样很容易造成缓冲区的溢出。 使用fgets可以避免缓冲区异常的危险,但是却将换行符’\n’,也读入到字符串中,因此需要对fgets函数进行封装(wrapper)。char buffer原创 2016-01-06 19:53:06 · 2033 阅读 · 0 评论 -
临界区
临界区是一种防止多个线程同时执行一个特定代码段的机制。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他试图访问此临界区的线程将被挂起,并一直持续到临界区的线程离开。**临界区适用于多个线程之间没有先后顺序但要求互斥的同步。**定义临界区变量: CRITICAL_SECTION criticalSection;初始化临界区 VOID WINAPI InitializeCri原创 2015-04-24 08:17:09 · 601 阅读 · 0 评论 -
指针
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋给指针一个字符串常量进行初始化。char* p = "making bread";//为其分配内存注意:只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如: float* pip = 3.141;//错误!编译无法通过! 在ANSCI 中,初始话指针时所创建的字符串常量原创 2015-05-26 08:45:31 · 611 阅读 · 0 评论 -
宏
C/C++程序进行编译时,实际经过了:预处理、编译、汇编和链接,其中预处理主要是针对宏。include “head.h” 首先找到head.h文件,并在includec “head.h”处展开;条件编译 预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。宏展开 预处理器将源程序文件中出现的对宏的引用展开成相应的宏原创 2015-05-19 12:00:06 · 491 阅读 · 0 评论 -
树的前序、中序、后序遍历
#include <iostream>#include <stdlib.h>using namespace std;#define MAXSIZE 100#define OK 0#define ERROR -1//定义结构体模板 template <typename Type> struct Node{ struct Node<Type>* left; Type val;原创 2015-04-29 08:45:19 · 477 阅读 · 0 评论 -
递归求解N阶行列式
#include "stdafx.h"#include <Windows.h>#include <process.h>#include <time.h>#include <iostream>using namespace std; int sum; int sum1,sum2; int **a,**b; int n;CRITICAL_SECTION cs;HANDLE evFin[2原创 2015-04-19 16:25:35 · 1330 阅读 · 0 评论 -
信号量解决生产者,消费者问题
#include <windows.h>#include <process.h>#include <iostream> #define BUFFER_SIZE 10 #define MAXNUM 3 using namespace std; int buffer[BUFFER_SIZE]; int r_count = 0; int w_count = 0;CRITICAL_SECTION原创 2015-04-22 13:54:28 · 783 阅读 · 0 评论 -
C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即::。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静转载 2014-04-28 13:50:05 · 609 阅读 · 0 评论 -
网络下载文件小程序(非原创,他人所写)
#include #include #include #include #include #include #include #include #include #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)#pragma comment(lib, "shlwapi.lib")#pragma comment(lib原创 2014-04-21 09:42:23 · 1291 阅读 · 0 评论 -
visor studio 2013创建DLL
创建动态链接库 (DLL) 项目在菜单栏上,选择“文件”,“新建、“项目”。在“新建项目”对话框左窗格中,展开“已安装”、“模板”、“Visual C++”,然后选择“Win32”。在中间窗格中,选择“Win32 控制台应用程序”。在“名称”框中为项目指定名称,例如,MathFuncsDll。 在“解决方案名称”框中为解决方案指定一个名称,例原创 2014-04-17 14:51:22 · 1025 阅读 · 0 评论 -
网易招聘试题
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(原创 2016-09-27 21:53:12 · 583 阅读 · 0 评论