类型前缀标明一个变量的类型,可以有如下几种:
类型前缀前缀 说明
n 整型和位域变量(number)
e 枚举型变量(enumeration)
c 字符型变量(char)
b 布尔型变量(bool)
f 浮点型变量(float)
p 指针型变量和迭代子(pointer)
pfn 特别针对指向函数的指针变量和函数对象指针(pointerof function)
g 数组(grid)
i 类的实例(instance)对于经常用到的类,也可以定义一些专门的前缀,如:std::string和std:: wstring类的前缀可以定义为"st",std::vector类的前缀可以定义为"v"等等。
如:m_nState
5、宏定义中的特殊参数(#、##、...和__VA_ARGS__)的用法(注意,这些只能用在宏定义中,不能用在其他地方)
1)__VA_ARGS__以及...
__VA_ARGS__用来代替...,比如说在一个宏中由于不知道有多少个参数,可以直接用...来表示,通过__VA_ARGS__来读取...中的内容如:#define check(...) printf(__VA_ARGS__)
如果我在下面调用
check("a= %d,b = %d", a, b);此时...代表了"a = %d,b = %d", a, b,而通过__VA_ARGS__来读取...的内容,即也为"a= %d,b = %d", a, b
即printf(__VA_ARGS__)变为printf("a= %d,b = %d", a, b)
这样,在一些情况下要定义自己的打印函数就特别方便了,比如我们要在A条件成立,且B条件不成立的情况下打印输出
#definecheck(...) printf(__VA_ARGS__)
#definecheck1(a,b,...) if (a&&!b){ printf(__VA_ARGS__);}else{printf("a =%d \n",a);}
inta = 1;
intb = 0;
check("a= %d,b = %d \n", a, b);
check1(a,b, "a = %d,b = %d \n", a, b);
结果为:a = 1,b =0
a= 1,b = 0
2)#
#作为一个预处理运算符,它可以把语言符号字符串化.例如我们定义的变量等,如果是在字符串中使用时(但是其前后必须是字符串形式),将其语言符号字符串化后并将其与左右连接起来,
如:
#defineTEST(x) printf("square of " #x" is %d.\n",(x)*(x))
intc = 10;
TEST(2);
TEST(c);
TEST(c- 2);
结果:
squareof 2 is 4.
squareof c is 100.
squareof c - 2 is 64.
特别重要的是,#和__VA_ARGS__以及...的搭配使用,可以将本不会将某些东西变为字符串形式变为字符串形式,如:
#definetoString(...) #__VA_ARGS__
char*shader = toString(
uniformsampler2D inputImageTexture;
uniformvec2 samplerSteps;
voidmain()
{
printf("ajlksajala!\n");
}
);
check(shader);
此时将uniformsampler2D inputImageTexture;
uniformvec2 samplerSteps;
voidmain()
{
printf("ajlksajala!\n");
}
变成了字符串的形式
结果为:
uniformsampler2D inputImageTexture;uniform vec2 samplerSteps;voidmain(){printf("ajlksajala!\n");}
3)##
我们可以讲Typedef当做是为某种数据类型取别名,这样我们就可以直接用这个别名来取代之前的数据类型来申明变量
Typedef数据类型 别名
typedefint INTEGER 这样在程序中可以用INTEGER代替int来进行定义,如INTERGER a;
typedef struct
{
int month;
int day;
int year;
}DATE;
这样可以用DATE定义变量:DATEbirthday; DATE *p;它代表一个结构体类型
typedef int ARR[10]; 这样用ARR a,b,c就等同于inta[10],b[10],c[10];
typedef 与#define的区别:(如typedef intCOUNT与#define COUNT int)
#define 在预编译时处理,它只能做简单的字符串替换,而typedef是编译时处理的,并非简单替换。typedef有利于程序的通用和移植
typedef int (*pcb)(int , int) ;
pcb p1,p2;
以上等价于: int(*p1)(int,int);
int (*p2)(int,int);
10、模板
类模板
template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数,也可以是非类型参数。类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量
//最简单的 template<class T>
//默认设置通用数据类型 template<class T =double>
//非类型参数 template <classtype=double, int size >
template<class T>
class templateClass{
public:
templateClass(T data){
this->data = data;
}