TL; DR
类型typedef
的{{1}}函数是否可以指向另一种类型foo
,依此类推?根据我的经验,是的,但这是怎么回事?
前言
受到this问题的启发,我尝试使用bar
函数指针。
出现了一些非常有趣的东西。我听说无法使用typedef
转换函数类型。
在以下情况下绝对如此:
typedef
这不仅因为它是不可能的,而且由于typedef existing type sometypedef(/*parameters*/);
sometypedef testfunc{
^
/*Error*/
};
而完全无用,但并不总是......
当魔法出现时
指针可以非常方便并导致很大的混乱,但在使用时非常有用。请考虑以下示例:
我们有一个函数template
,我们希望将其作为指针引用。
没有问题,只要没有复杂的参数。
但现在想要引用foo
和其他变量的函数foo
的参数。现在我们被卡住了,因为
bar
或类似的东西是不允许的。我们根本无法引用void* foo(/*parameters*/);
void bar(foo* f)
。但是不要放弃吧!因为这里foo
很有用。我们可以做类似
typedef
现在它有效!!
......但这不是实际问题
因为真正的问题是如何?例如,以下代码如何工作?:
typedef void (*newfunctype)(/*pointer parameters*/);
newfunctype* foo();
newfunctype bar(newfunctype* nf);
我们甚至可以用这些东西制作功能,比如
typedef void (*sometype)();
typedef sometype(*anothertype)(sometype);
typedef anothertype(*yetanothertype)(sometype);
yetanothertype d(anothertype);
/*etc, other initializations*/
他们...... 像魅力一样工作?
这些指向新anothertype anotherfunc(anothertype* an, yetanothertype* sn);
类型的指针可以扩展多长时间?永远?
这是真正标准的c ++(或c?)语法,还是会导致未定义的行为?
答案 0 :(得分:1)
为什么它不起作用?工作有什么问题?真的没什么。但无论如何......
typedef只是其他类型的别名。让我们从一个例子开始:
using MyType = int; // same thing as typedef int MyType
MyType a;
MyType b;
对于编译器来说,上面的代码变为:
int a;
int b;
现在你问问你的例子是如何运作的。好吧,让我们将typedef扩展为真实的类型:
typedef int* MyType1;
typedef MyType1* MyType2;
typedef MyType2* MyType3;
MyType3 a;
我们首先使用更清晰的语法:
using MyType1 = int*;
using MyType2 = MyType1*;
using MyType3 = MyType2*;
MyType3 a;
现在该名称不属于该类型,很容易看出编译器如何扩展类型。我们手动完成:
// using MyType1 = int*;
using MyType2 = int**;
using MyType3 = MyType2*;
MyType3 a;
然后:
// using MyType1 = int*;
// using MyType2 = int**;
using MyType3 = int***;
MyType3 a;
然后:
// using MyType1 = int*;
// using MyType2 = int**;
// using MyType3 = int***;
int*** a;
但事实确实如此。 Typedef是类型的别名,它们不是变量,也不是任何运行时实体。它只是编译器为你编写复杂的类型,给它一个漂亮的名字。
所以不,你可以通过制作太多的typedef来解决未定义的行为。但是,如果您滥用类型,则可能会有未定义的行为,但这是另一回事。