是无限的Typedef函数指针继承

Are infinite typedef function pointer inheritances possible?

本文关键字:指针 继承 函数 Typedef 无限      更新时间:2023-10-16

tl; dr

可以让foo类型的typedef函数指向另一种类型bar,依此类推?根据我的经验是的,但是这怎么样?

前言

受这个问题的启发,我尝试使用typedef功能指针。有些有趣的事情出来了。我已经听说过无法使用typedef施放功能类型。

在诸如:

之类的情况下,这绝对是正确的
typedef existing type sometypedef(/*parameters*/);
   sometypedef testfunc{ 
                  ^
             /*Error*/
   };

这不仅是因为它是不可能的,而且由于 template,而且并非总是没有……

当魔术出现

Pointers 可能非常方便,并导致极大的困惑,但使用时确实有帮助。考虑以下示例:

我们有一个函数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);

他们... 像魅力一样工作

这些指针可以扩展到新的typedef类型?永远?这确实是标准的C (或C?)语法,还是导致不确定的行为?

为什么不起作用?它有什么问题?真的没什么。但是无论如何...

typedefs仅是其他类型的别名。让我们从一个示例开始:

using MyType = int; // same thing as typedef int MyType
MyType a;
MyType b;

在编译器的眼中,上面的代码变成了:

int a;
int b;

所以现在您询问示例是如何工作的。好吧,让我们将Typedefs扩展到真实类型中:

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来实现不确定的行为。您可能有未定义的行为是滥用类型,但这是另一回事。