c++ - 无限的 typedef 函数指针继承可能吗?

标签 c++ c pointers types

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/

相关文章:

c++ - 在 Linux 中制作程序,OpenGL、Wayland 和 Qt 如何融入画面

c - 在 C 中复制字符串时遇到问题?

c++ - 使用 std::auto_ptr 的感觉

c - 尝试返回 char 指针时出现奇怪的输出

C++ 删除类成员 Char*

c++ - 在 c 中复制数组与复制 int 成本和性能

将 uint32_t 转换为网络字节顺序

c++ - 如何将分配给 *Child[n] 的 *Base 指向 Child 数组的下一个元素?

c++ - OpenCV - 禁用打印异常

c - 如何将矩阵的一行元素传递给函数?