您的位置:首页 > 其它

经验总结

2015-12-01 20:21 295 查看

变长参数

[code]void ShowLog(const char* formart, ...)
{
    FILE* filelog = fopen("log.txt","a+"); //没有则创建
    if(!filelog)
        return;
    char StrOut[100] = {0};
    va_list arg_ptr = NULL;
    va_start(arg_ptr,formart);
    vsprintf_s(StrOut,formart,arg_ptr);
    va_end(arg_ptr);
    fprintf(fileLog,StrOut);
    fclose(filelog);
}


线程基类和锁

[code]#include <Windows.h>
class HThread
{
public:
    HThread();
    virtual ~HThread();
    virtual void Run() = 0;
    virtual void Start();
    void SetId(int Id){mThreadId = Id;};
    int GetId(){return mThreadId;};
    HANDLE GetHandle(){return mThread;};
private:
    static DWORD WINAPI ThreadFunc(LPVOID lpParm);
    HANDLE mThread;
    int  mThreadId;
};

// 互斥锁
class Mutex
{
private:
    Mutex(const Mutex&);
    Mutex& operator=(const Mutex&);
public:
    Mutex():cs(){InitializeCriticalSection(&cs);}
    ~Mutex(){DeleteCriticalSection(&cs);}
    void lock(){EnterCriticalSection(&cs);}
    void unlock(){LeaveCriticalSection(&cs);}
private:
    CRITICAL_SECTION cs;
};

// 锁类
class LOCK
{
private:
    LOCK(const LOCK&);
    LOCK& operator=(const LOCK&);
public:
    explicit LOCK(Mutex& c):cs(c){cs.lock();}
    ~LOCK(){cs.unlock();}
private:
    Mutex& cs;
};

//.cpp
HThread::HThread():mThreadId(0){}
HThread::~HThread(){}
DWORD WINAPI HThread::ThreadFunc(LPVOID lpParm)
{
    assert(lpParm);
    HThread* pThrd = static_cast<HThread*>(lpParm);
    pThrd->Run(); //具体子类实现的线程功能
    return 0;
}
void HThread::Start()
{
    mThread = CreateThread(NULL,0,ThreadFunc,this,0,NULL); // 0/CREATE_SUSPENDED
}


设置conslole颜色

[code]#include <conio.h>
inline void SetTextColor(WORD colors)
{
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole,colors);
}
// SetTextColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);


注: 文本相关的定义在头文件: wincon.h中, 定义了字体颜色, 背景颜色, 输出位置等信息, 通过位信息标记;

二维数组参数传递

比如有一个二维数组:
int H[2][2] = {{1,2},{3,4}};
要将她传递作为一个参数传递给一个函数, 有以下几种形参方法:


[code]void Func(int a[][2]); // 一定要指定第二维长度,这样才可以正确用[][]寻址
//上面的也可以写成: 
void Func(int (*a)[2]); 
//调用时:
Func(H);
/************************************/
// 也可以直接用指针的指针来传递,不过此时是作为一维数组来运算
void Func(int **a, int m, int n);
// 调用:
Func((int**)H,2,2);   *((int*)array + n*i + j);


“snprintf”: 找不到标识符

[code]snprintf()函数的格式跟printf差不多一样,是在c里面用的函数,包含在`#include       <stdio.h>`头文件中。
但snprintf()函数并不是标准c/c++中规定的函数,所以在许多编译器中,厂商提供了其相应的实现的版本。在gcc中,该函数名称就snprintf(),而在VS中称为_snprintf。 所以在需要使用snprintf()时改成_snprintf就可以了,或则在预编译处加入:


[code] #if _MSC_VER
 #define snprintf _snprintf
 #endif


模板类和模板函数

模板类成员函数声明与定义


[code] template<class T>
class A
{
public:
    void func();
}
template<class T>
void A<T>::func()
{ 
    /******/
}


普通类模板函数


[code]class B
{
public:
    template<MsgId id>
    void Recv();
}
template<>
void B::Recv<MSG_XX>()
{
    /*****/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: