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

Val*_*ron 32 c c++ typedef function-pointers

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

typedef unsigned char Uchar;
Run Code Online (Sandbox Code Playgroud)

但是函数指针完全不同.这里的新类型是pFunc:

typedef int (*pFunc)(int);
Run Code Online (Sandbox Code Playgroud)

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

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

另外:a的范围是typedef什么?

CB *_*ley 63

基本上a typedef与语句具有完全相同的语法,除了它带有前缀typedef并且改变了含义,以便新标识符声明了一个类型的别名,该对象将被声明为普通声明所具有的对象.

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

例如

声明int:

int a;
Run Code Online (Sandbox Code Playgroud)

声明一个别名的类型int:

typedef int a_type;
Run Code Online (Sandbox Code Playgroud)

声明一个指向以下内容的指针char:

char *p;
Run Code Online (Sandbox Code Playgroud)

声明一个别名char *:

typedef char *pChar;
Run Code Online (Sandbox Code Playgroud)

声明一个函数指针:

int (*pFn)(int);
Run Code Online (Sandbox Code Playgroud)

声明"指向函数获取int和返回int的指针"类型的别名:

typedef int (*pFunc)(int);
Run Code Online (Sandbox Code Playgroud)

  • 辉煌; 显示OP无法看到的语法的一致性. (5认同)

Kei*_*son 5

对于语法上的方便,typedef将被视为一个存储类说明,如externstatic,或register。语义上当然是完全不同的,但是当typedef添加到语言中时,使用现有的语法来定义其语法会更简单。

添加static到对象声明不会改变声明的含义,只是将对象的存储类更改为“静态”(如果尚未存储):

{
    int foo; /* automatic storage duration */
    static int bar; /* static storage duration */
}
Run Code Online (Sandbox Code Playgroud)

更换statictypedef变化宣言的意义,从而使所定义的名称是不是对象的名字,但类型名(其实只是为现有类型的别名):

    typedef int baz; /* "baz" is an alias for "int" */
Run Code Online (Sandbox Code Playgroud)

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

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" */
Run Code Online (Sandbox Code Playgroud)

一旦你意识到typedef被任意推到相同的插槽中的语法占领了externstaticregister,善解人意typedef声明是没有困难(没有更简单!),比认识对象声明。(该cdecl程序和网站对于解压缩复杂的声明很有用。)

您还可以为typedef函数类型输入:

void func(void);              /* declare func as a function */
typedef void func_type(void); /* declare func_type as a name
                                 for a function type */
Run Code Online (Sandbox Code Playgroud)

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

func_type *ptr = func;
Run Code Online (Sandbox Code Playgroud)

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