类型前缀标明一个变量的类型,可以有如下几种: 类型前缀前缀 说明 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; }