gpt4 book ai didi

非类 typedef 的 C++ 前向声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:37 24 4
gpt4 key购买 nike

我有这个:

//forward declaration of Foo <-- this is my question
void doSome(Foo foo);

typedef void* Foo; //Foo is defined later as void*

void doSome(Foo foo)
{
//code here..
}

如何以与 void* 兼容的方式转发声明 Foo?

这是一个过于简单的例子,当然在这里很简单,但这个想法有多个实现,像这样:

//forward declaration of Foo <-- this is my question
void doSome(Foo foo);

//[implementation1_internal.h]
typedef void* Foo; //Foo is defined later as void*

void doSome(Foo foo)
{
//code here..
}

//[implementation2_internal.h]
typedef int* Foo; //Foo is defined later as int*

void doSome(Foo foo)
{
//code here..
}

并使用预处理器指令选择其中之一。 (这无关紧要,只是为了说明这个例子并不愚蠢)。

最佳答案

为什么不能把typedef放在前面。如果您声明具有给定自定义类型(类或 typedef)参数的函数,您也需要以某种方式声明此类。

在指向类/结构的指针的情况下,即使不知道类成员 (=sizeof(pointer)),其大小也是众所周知的,在类型定义类型的情况下,除非您提供完整的 typedef 声明。

因此,解决方案是将 typedef 放在函数声明之前。

你应该:

 // declarations
typedef void* Foo; //Foo is defined later as void*
void doSome(Foo foo);

// definitions
void doSome(Foo foo)
{
//code here..
}

如果由于某种原因无法修改定义,可以重复两次typedef(只要两者不冲突/完全相同):

 // declarations
typedef void* Foo;
void doSome(Foo foo);

// definitions
typedef void* Foo;
void doSome(Foo foo)
{
//code here..
}

问题编辑后编辑

最好的方法是重载函数:

  void doSome(void* foo)
{
// void* version
}

void doSome(int* foo)
{
// int* version
}

在您的项目周围使用不同的 Foo 并不是一个好主意。

关于非类 typedef 的 C++ 前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8758299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com