TL;DR
foo
类型的 typedef
函数是否可以指向另一个类型 bar
等等?根据我的经验是的,但是这是怎么回事?
前言
灵感来自this问题,我尝试使用 typedef 函数指针。
一些非常有趣的事情出现了。我听说不可能使用typedef
来转换函数类型。
在以下情况下这绝对是正确的:
typedef existing type sometypedef(/*parameters*/);
sometypedef testfunc{
^
/*Error*/
};
这不仅因为这是不可能的,而且因为模板
而完全无用,但并不总是......
当魔法降临
指针可能非常方便,但会导致极大的困惑,但如果使用得当,确实很有帮助。考虑以下示例:
我们有一个函数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?)语法,还是会导致未定义的行为?
最佳答案
为什么它不起作用?它工作起来有什么问题吗?真的没什么。但无论如何...
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 来产生未定义的行为。但是,如果您滥用类型,则可能会出现未定义的行为,但这是另一回事。
关于c++ - 无限的 typedef 函数指针继承可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322099/