HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

预处理和typedef

Posted on 2011-10-01 20:54  光铭  阅读(802)  评论(0编辑  收藏  举报

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;
这两种都没有结构标签,第一种只不过声明了一个typedef类型。第二种定义了一个结构变量。
第一种和下面的这个其实一样
struct simplestruct{
             int i;
 } 
对第一个simplestruct.i=10;是错误的
对第二个simplestruct.i=10;是正确的

 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];