2016-12-25 80 views
-1

TL; DR是否有无限的typedef函数指针继承可能?

是否有可能,为foo类型的typedef功能指向另一种类型bar等?以我的经验是,但这是怎么回事?

前言

通过this问题的启发,我试图玩弄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); 

,他们... 工作般的魅力

这些指向新的typedef类型的指针可以扩展多长时间?永远? 这是非常标准的C++(或c?)语法,还是会导致未定义的行为?

+1

'yetanothertype * f = new yetanothertype();'我不认为这是个好主意。 –

+0

@GuillaumeRacicot为什么这样?是不是初始化指针总是一个好主意? – Tatu

+0

您正在动态分配一个函数指针。免费商店是可读写的内存,但不可执行。任何尝试使用它都会导致分段错误。 –

回答

1

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

typedefs只是其他类型的别名。让我们先从一个例子:

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

MyType a; 
MyType b; 

编译器的眼睛,上面的代码变成这样:

int a; 
int b; 

所以,现在你问你的例子是如何工作的。好吧,让我们扩展类型定义为真正的类型:

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; 

但它是真的。 Typedefs是类型的别名,它们不是变量,也不是任何运行时实体。这只是编译器通过给它一个漂亮的名字来为你写出复杂的类型。

所以不,你不能有太多的typedefs有未定义的行为。你可以有不确定的行为,但是你滥用类型,但那是另一回事。