是否可以使用无限的typedef函数指针继承?

时间:2016-12-25 14:49:26

标签: c++ c pointers types

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?)语法,还是会导致未定义的行为?

1 个答案:

答案 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来解决未定义的行为。但是,如果您滥用类型,则可能会有未定义的行为,但这是另一回事。