1. 不要在头文件中作定义.
packet.h 文件中定义了两个 map 和若干函数, packet.cpp 中引用 map 并实现函数, 本以为皆大欢喜.
在 main.cpp 中引入 packet.h 并调用一个函数测试, 报错, 重定义.
先 google 之, 未果, 想了一下, 忽然意识到 effective c++ 中讲到不要再头文件中作定义.
将 map 放到 packet.cpp 中, 编译报错, 需要在 main.cpp 中放入 extern 声明.
终于 work.
2. 昨晚抽空看了下 google c++ style
看的目的是想搞明白变量到底怎么去定义比较好, 但看完后觉得收货并不大. 我看过不少写的比较漂亮的源代码, 比如在 visual studio 中随便找到一个函数的定义会跳到该函数的定义, 唔… 写的真漂亮, 我今天看到 winsock.h 文件, 一个头文件 4000 多行, 写的真是工整, 但代码的 style 和 google 推崇的相差甚远
总结了几条自己觉得还比较有用的 http://app.yinxiang.com/shard/s9/sh/4154986d-c12c-4201-a623-8d0bb8699483/c79e17566d4a047310d1bc04b112e06b
3. 时间类
Pcap 头中有 timeval 结构体
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
这个比较精确, 一般使用 time_t 就足够了, time_t 是 unix 标准时间戳, 记录从 1970 到现在经过的秒数
另外, 直接存储年月日的是一个结构体 tm
struct tm
{
int tm_sec; /*秒,正常范围0-59, 但允许至61*/
int tm_min; /*分钟,0-59*/
int tm_hour; /*小时, 0-23*/
int tm_mday; /*日,即一个月中的第几天,1-31*/
int tm_mon; /*月, 从一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 从1900至今已经多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
int tm_isdst; /*日光节约时间的旗标*/
};
常用用法
1) 已知 time_t, 从 UTC 时间转化到当地时间并输出可读的时间格式
time_t ltime = 1346030160;
char buf[30] = {0};
struct tm *timeptr = localtime(<ime);
strftime(buf,30,"%Y/%m/%d,%H:%M:%S \n" , timeptr);
printf(buf);
2) 标准用法, 获取时间
time_t timep;
time(&timep);
4. Boost filesystem 前面已经 POST
5. Winpcap 编程前面已经 POST