越努力 越幸运

关键字 typedef 深入了解

一、引子:几行代码

为了不浪费时间,先来看看如下三行代码:

typedef int arr[10];
typedef void (*pf)();
typedef int* (*pf)(int* (p*)(int*, int*), int*);

如果能准确知道上面三行代码的意义,我想就没有必要继续往下看了,当然,为了温习也可以快速阅读。

二、定义 struct 时 typeder 的含义

1. 在 C 中定义一个结构体类型需要用 typedef 关键字:

typedef struct TestS
{
    int a;
}Test;

于是在声明变量时就可以这样:Test test; 如果没有 typedef 就必须用 struct TestS test; 来声明,这里的 Test 实际上就是 struct TestS 的别名,即 Test == struct TestS。

另外,这里也可以不写 TestS,也就不能 struct TestS test; 了,必须是 Test test;,如下:

typedef struct
{
    int a;
}Test;

2. 在 C++ 中定义一个结构体类型不再需要用 typedef 关键字:

在 C++ 里定义一个结构体类型就很简单直接了:

struct TestS
{
    int a;
};

这样就定义了结构体类型 TestS ,声明变量时直接 TestS test; 即可。

使用 Python 编写 Windows 服务程序

一、前言

为了简化文章内容,至于什么是 Windows 服务程序以及如何使用 C/C++ 编写一个服务程序等相关内容,后续专门针对这个主题写篇博客。而本文的主旨是使用 Python 语言来编写 Windows 服务程序,只需要知道在 Windows 上服务在哪里,如何开启、暂停、关闭,以及服务程序的好处即可。

1. 服务程序在哪里?

这个或许大部分人都知道,就不上图了,用文字描述:

右键我的电脑(计算机) ——> 管理 ——> 服务和应用程序 ——> 服务

点击服务会展开很多服务列表,比如 Apache 等。

2. 如何开启、暂停、关闭服务?

在上一步中,已经打开服务列表了,只要右键点击服务列表中某一项,就能通过右键菜单选择开启、暂停和关闭服务,由于每个服务程序编写的不一样,执行这些操作也会有不同的响应信息。

3. 服务有些什么好处?

先不展开说服务程序有些具体的好处,更详细的信息在后续的文章里来说明,本文只说具体案例使用 Windows 服务的好处。

问题:执行一个自动化测试,需要重启电脑后继续执行动作(无界面)。

可行的解决方案:写个可执行文件(比如 bat, exe),设置开机自启动项(添加注册表项)。

但是不想做那么多事,有没有直接点的解决方案?这就是服务的好处:

Python 装饰器

一、介绍

二、其他

先贴一段代码,后续再补充装饰器相关的知识点:

def parameter(lst, round):
    def wrapper(func):
        def action(self):
            for i in xrange(round):
                for l in lst:
                    func(self, l, i)
            return
        return action
    return wrapper


class Test(unittest.TestCase):

    testlist = ['tian', 'zhang', 'li']
    testround = 2

    @classmethod
    def setUpClass(cls):
        pass

    def setUp(self):
        pass

    @parameter(lst=testlist, round=testround)
    def testAction(self, e, i):
        print e, i

    def tearDown(self):
        pass

    @classmethod
    def tearDownClass(cls):
        pass


if __name__ == '__main__':
    unittest.main()

将参数封装后做装饰器用。

一个超简单的 C++ 日志文件

一、介绍

在平时的工作和学习中,编写一些 C++ 程序时,为了调式通常都是使用类似 printf 的函数和打断点的方式。但是,调式程序或者程序发布测试版后,记录程序执行日志也是一种比较有效的调式和收集问题信息的手段。在现在这个开源的时代,并不需要我们自己去写一套日志库(C++版),开源的已经有很多了,如:

spdlog

log4cplus

boost log

glog

在 Github 上以关键字 log 搜索就会出来很多相关的,但是这些库中以我的了解经验来看,要数 Easyloggingpp 最为简单了,使用无需其他任何外部依赖,仅有一个 easyloggin++.h 头文件。下文就对此做一些简要介绍,以作记录。

二、示例

在编写 C++ 应用时,通常是以 EXE 或者 DLL 的形式存在,对于这两种不同形式,使用 Easyloggingpp 也有所区别。

1. 在 EXE 工程中使用 Easyloggingpp

先看代码,如:

#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

int main(void)
{
   		LOG(INFO) << "easylogging++ test!";
   		return 0;
}

代码看起来很简单,主要做了三件事:

a. 引入 easylogging++.h 头文件

b. 使用初始化宏进行初始化

c. 使用日志宏进行日志输出(记录到文本)

2. 在 DLL 工程中使用 Easyloggingpp

在 DLL 工程中使用时,有所区别,代码如:

// tells easylogging++ that it's used for DLL
#define ELPP_AS_DLL
// tells easylogging++ to export symbols
#define ELPP_EXPORT_SYMBOLS

#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

int main(void)
{
   		LOG(INFO) << "easylogging++ test!";
   		return 0;
}
设计模式之观察者模式

一、介绍

二、参考资料