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)
对于语法上的方便,typedef将被视为一个存储类说明,如extern,static,或register。语义上当然是完全不同的,但是当typedef添加到语言中时,使用现有的语法来定义其语法会更简单。
添加static到对象声明不会改变声明的含义,只是将对象的存储类更改为“静态”(如果尚未存储):
{
int foo; /* automatic storage duration */
static int bar; /* static storage duration */
}
Run Code Online (Sandbox Code Playgroud)
更换static与typedef变化宣言的意义,从而使所定义的名称是不是对象的名字,但类型名(其实只是为现有类型的别名):
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被任意推到相同的插槽中的语法占领了extern,static和register,善解人意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声明定义的标识符与任何其他声明的标识符具有相同的范围。如果在文件作用域中的任何函数外部声明了它,则从声明点到文件末尾都是可见的。如果在函数内部声明它,则从声明它的位置到最近的封闭块的末尾都是可见的。与任何声明一样,它可以被内部作用域中具有相同名称的另一个声明隐藏。