关于VC++预处理指令#和##

#不管传入什么参数,都会转换成字符串

##不管是什么类型,都会连接到一起,但要求传入的参数应该是同一种类型

eg.

//language:c
#include <stdio.h>
int main()
{
#define PASTE(a,b,c) (#a#b#c)
    printf("%s/n", PASTE(7,8,9));
#define NUM(a,b,c) (a##b##c)
    printf("%d/n", NUM(1,2,3));
#define STR(a,b,c) (a##b##c)
    printf("%s/n", STR("a","b","c"));
    return 0;
}

温故而知新,函数指针

 函数指针:

一个函数在编译时被分配一个入口地址,这个入口地址就是函数指针.可以用一个指针变量指向该函数指针,然后通过该变量来调用函数.

声明:

返回值类型 (*指针变量名)(参数类型列表);

或

typedef 返回值类型 (*指针变量名)(参数列表名);

Win32编程,让DC不重画某个区域的API函数

Win32编程,让DC不重画某个区域的API函数:ExcludeClipRect

描述:这个函数将创建一个新的区域,这个新的区域 由 现有的区域 去掉 指定区域 后 组成。

功能:可以让DC不刷新某个指定区域。

说明:这个函数在MFC中的CDC类里有封装。

int ExcludeClipRect(
    HDC hdc, // handle to DC
    int nLeftRect, // x-coord of upper-left corner
    int nTopRect, // y-coord of upper-left corner
    int nRightRect, // x-coord of lower-right corner
    int nBottomRect // y-coord of lower-right corner
);

关于C++模板中的嵌套依赖类型名与typename

typename一共就两种用法

①修饰模板参数,说明它是一个类型.此时可以用class关键字来代替.

②修饰嵌套依赖类型名

关于第②点要说明如下:

  1. 依赖类型名: 一个模板中的 依赖于一个模板参数的名字.
  2. 嵌套依赖类型名: 嵌套在一个类内部的一个依赖类型名

比如:

std::list

首先,它是一个依赖于模板参数的类型,所以它是一个依赖类型名

其次,它也是一个嵌套在std内部的类型,所以它是 嵌套依赖类型名,需要用typename来修饰.如下:

typename std::list m_lstT;

记住:

在涉及到一个模板中的嵌套依赖类型名的任何时候,都必须把typename放在紧挨着它的前面.