假设:
typedef type-declaration synonym;
我可以看到:
typedef long unsigned int size_t;
将size_t
声明为long unsigned int
的同义词,但我(知道确实如此)无法完全看到 :
typedef int (*F)(size_t, size_t);
将F
声明为pointer to function (size_t, size_t) returning int
第一个示例中的typedef的两个操作数(type-declaration, synonym)
是long unsigned int
和size_t
。
F
声明中typedef的两个参数是什么,或者是否存在typedef的重载版本?
如果C和C ++之间存在相关区别,请详细说明,否则我主要对C ++感兴趣,如果这有帮助的话。
答案 0 :(得分:31)
使用typedef
的类型声明与相应的变量声明相同,只是前缀为typedef
。所以,
int x; // declares a variable named 'x' of type 'int'
typedef int x; // declares a type named 'x' that is 'int'
与函数指针类型完全相同:
int(*F)(size_t); // declares a variable named F of type 'int(*)(size_t)'
typedef int(*F)(size_t); // declares a type named 'F' that is 'int(*)(size_t)'
这不是一个“特例”;这就是函数指针类型的样子。
答案 1 :(得分:7)
这不是typedef的正式语法,它只是它可以采用的模式之一。在C标准6.7.1中,typedef
在语法上被定义为存储类说明符(如extern
或static
)。它修改了一个声明,因此声明声明了一个类型别名而不是一个对象。
typedef
不是函数或运算符,因此“参数”,“操作数”或“重载”的概念不适用于它。它只是告诉编译器你正在做什么样的声明。
在C ++中,typedef
在语法上定义为 decl-specifier ,它不是存储类说明符。 存储类说明符也是 decl-specifiers ,friend
也是如此。我不认为这会产生任何实际的区别,这是另一种说C相同的方式,但如果你想要自己看一下,它是C ++标准的7.1。我承认暂时让我感到困惑。
答案 2 :(得分:2)
关于具有
的typedef语法的初始假设typedef type-declaration synonym;
结构绝对不正确。 Typedef语法没有那个结构,从来没有。
Typedef语法是普通声明的语法,就像C语言中的任何其他声明一样。关键字typedef
只是一个声明说明符,表示声明的名称是typedef名称,而不是变量,函数指示符或其他名称。
您可以在同一typedef声明中使用多个声明符,例如
typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10];
答案 3 :(得分:1)
不要将typedef
视为采用两个参数(类型和同义词)的操作,而应将其视为类型限定符。要声明一个名为F
的变量,它是一个函数指针,接受两个size_t
参数并返回int
,您只需:{/ p>
int (*F)(size_t, size_t);
添加类型限定符typedef
,而不是声明变量,而是声明了类型别名。
答案 4 :(得分:0)
typedef
正在使用声明语法。
函数指针typedef
与用于声明函数指针的函数指针相同。除了那种情况,你要声明一个类型,而不是变量。