请解释“typedef”的语法规则和范围

时间:2010-03-11 18:47:03

标签: c++ c function-pointers typedef

有什么规则? OTOH的简单案例似乎意味着新类型是最后一件事。像这里Uchar是新类型:

typedef unsigned char Uchar;

但是函数指针完全不同。新类型为pFunc

typedef int (*pFunc)(int);

我无法想到任何其他的例子,但我遇到了一些令人困惑的用法。

那么有规则还是人们应该从经验中知道这是怎么做的,因为他们之前已经看过这样做了?

另外:typedef的范围是什么?

3 个答案:

答案 0 :(得分:58)

基本上typedef具有与对象声明完全相同的语法,除了它以typedef为前缀并更改含义,以便新标识符声明对象类型的别名如果这是一个正常的声明本来就会被宣布。

typedef的范围与对象声明的范围完全相同,因此它可以是块的文件范围或本地,或者(在C ++中)到命名空间或类。

e.g。

声明int

int a;

声明属于int的别名的类型:

typedef int a_type;

声明指向char的指针:

char *p;

声明char *的别名:

typedef char *pChar;

声明一个函数指针:

int (*pFn)(int);

声明类型的别名是'指向函数的指针int并返回int':

typedef int (*pFunc)(int);

答案 1 :(得分:4)

为方便起见,typedef被视为存储类说明符,例如externstaticregister。在语义上当然它是完全不同的,但是当typedef添加到语言中时,使用现有的语法片段来定义其语法会更简单。

static添加到对象声明中不会改变声明的含义,除了它将对象的存储类更改为“static”(如果它还没有):

{
    int foo; /* automatic storage duration */
    static int bar; /* static storage duration */
}

static替换typedef会更改声明的含义,以便定义的名称不是对象名称而是类型名称(实际上只是现有类型的别名):

    typedef int baz; /* "baz" is an alias for "int" */

相同的语法适用于更复杂的声明:

int (*a)[42];         /* a is a pointer to an array of 42 ints */
static int (*b)[42];  /* Same as a, but with static storage duration */
typedef int (*c)[42]  /* c is an alias for the type int(*)[42], or 
                         "pointer to array of 42 ints" */

一旦您意识到typedef被任意推入externstaticregister占用的语法中的同一个广告位,请理解typedef声明并不比理解对象声明更难(也不容易!)。 (cdecl程序和web site对于解包复杂声明非常有用。)

您还可以为函数类型设置typedef

void func(void);              /* declare func as a function */
typedef void func_type(void); /* declare func_type as a name
                                 for a function type */

您不能使用typedef ed函数类型来声明或定义函数,但您可以使用它来声明函数指针:

func_type *ptr = func;

对于范围(意味着声明的标识符可见的程序文本区域),typedef声明定义的标识符与任何其他声明的标识符具有相同的范围。如果它在文件范围内声明,在任何函数之外,它从声明点到文件末尾都是可见的。如果它在函数内部声明,则从声明它的位置到最近的封闭块的末尾是可见的。和任何声明一样,它可以被内部作用域中具有相同名称的另一个声明隐藏。

答案 2 :(得分:0)

仅因为没有人提到它:它总是本地化为任何对象构建。因此,如果您使用相同的using / typedef名称编译不同的cpp文件,则它们不会互相影响。