0.条件编译语句#if不能使用sizeof,因为预处理器不对类型名进行分析。但预处理器并不计算#define语句的表达式。因此才#difine语句中使用sizeof是正确的。
1.typedef 和#define
首先,#define是预处理,语句后面不需要分号
其次,注意下面两个区别
#define string_d char * typedef char * string_t; string_d s1,s2; string_t s3,s4;
s1,s3,s4都被声明为char *,而s2被声明为char。
所以用于处理指针时,最好使用typedef。
2.
typedef struct { char *item; NODEPTR next; }*NODEPTR;
但是编译器报告了错误信息,难道在c语言中结构不能包含指向自己的指针吗?
c语言中结构当然能包括指向自己的指针,这个问题在于typedef。不能在定义typedef前使用它,在上面的例子中,在next域声明的地方还没有定义NODEPTR。要解决这个问题。首先赋予这个结构一个标签(“struct node"),然后声明next域为("struct node *"),或者分开typedef声明还结构定义,或者两者都采纳,以下是修正后的一个版本。
typedef struct node{ char *item; struct node * next; }*NODEPTR;
也可以在声明结构之前先用typedef,然后就可以在声明中使用类型定义NODEPTR了,下面这种情况在struct node 还没有完全定义的情况下就使用它来声明一个新的typedef
,这是允许的。
struct node;//在使用前先声明 typedef struct node *NODEPTR; struct node{ char *item; NODEPTR next; };//这个可以叫做定义
最后这是一种两种情况都采用的方法。
struct node{ char *item; struct node * next; }; //从这里也可以看出,定义结构时,结构变量可以是指向自己的指针 typedef struct node * NODEPTR;
3.注意以下两种区分
typedef struct{ int i; }simplestruct; struct{ int i; }simplestruct;
4.
typedef int (*funcptr) ();
这个是什么意思?它定义了一个类型funcptr,表示指向返回值为int的函数的指针。它可以用来声明一个或多个函数指针
funcptr fp1,fp2;
这个声明等价于以下的写法
int (*fp1) ( ), (*fp2) ( );
typedef int Long_int[3];
Long_int a;
相当于int a[3];
typedef int arr[5]; typedef arr Array[10];
Array a;
相当于int a[10][5];