gpt4 book ai didi

c - 在函数结构上静默 WCast-function-type

转载 作者:行者123 更新时间:2023-11-30 14:34:08 27 4
gpt4 key购买 nike

我收到以下警告:

cast between incompatible function types from ‘int (*)(pile *)’ {aka ‘int (*)(struct pile *)’} to ‘void (*)(void *)’ [-Wcast-function-type] 

我不知道如何解决此警告。

结构

typedef struct conteneur_sommets {
void *donnees;
int (*est_vide)(void *);
void (*ajouter)(void *, int);
void (*supprimer)(void *);
int (*choisir)(void *);
void (*detruire)(void *);
} conteneur_sommets;

关联函数

conteneur_sommets *cs_creer_pile(int n)
{
conteneur_sommets cs = {.donnees = pile_creer(n),
.est_vide = (int (*)(void *)) pile_est_vide,
.ajouter = (void (*)(void *, int)) pile_empiler,
.supprimer = (void (*)(void *)) pile_depiler, <- warning cast
.choisir = (int (*)(void *)) pile_sommet,
.detruire = (void (*)(void *)) pile_detruire};
return cs_creer(&cs);
}

void cs_supprimer(conteneur_sommets *cs)
{
cs->supprimer(cs->donnees);
}

最佳答案

虽然完全抑制警告有时很有用,但通常最好在代码级别修复问题。这里的问题是您的声明是错误的,这就是首先触发警告的原因。首先避免将结构/union 的定义与 typedef 别名的声明结合起来。最好将它们分开,这样您就可以在必要时分开声明和定义。

typedef struct conteneur_sommets conteneur_sommets;

这将创建 opaque 结构 struct conteneur_sommets 的别名 conteneur_sommets。这也称为前向声明。前向声明一般放在头文件中。

现在我们可以定义结构了

struct conteneur_sommets {
void *donnees;
int (*est_vide)(conteneur_sommets *);
void (*ajouter)(conteneur_sommets *, int);
void (*supprimer)(conteneur_sommets *);
int (*choisir)(conteneur_sommets *);
void (*detruire)(conteneur_sommets *);
};

这样,您就不需要强制转换函数指针并保留类型检查(如果它具有正确的签名)。

conteneur_sommets cs = {.donnees   = pile_creer(n),
.supprimer = pile_depiler};
<小时/>

其次C 程序员很少意识到的一件事是,我们可以定义函数原型(prototype)的 typedef 别名,而不是函数指针,而是直接定义原型(prototype)。即使很不寻常,有时这确实可以使代码更具可读性。让我用你的代码给你一个例子:

typedef int  est_vide_fn (conteneur_sommets *);
typedef void ajouter_fn (conteneur_sommets *, int);
typedef void supprimer_fn(conteneur_sommets *);
typedef int choisir_fn (conteneur_sommets *);
typedef void detruire_fn (conteneur_sommets *);

这声明了五个函数原型(prototype)类型定义。

该结构现在可以声明为

struct conteneur_sommets {
void *donnees;
est_vide_fn *est_vide;
ajouter_fn *ajouter;
supprimer_fn *supprimer;
choisir_fn *choisir;
detruire_fn *detruire;
};

您的 cs_supprimer 函数原型(prototype)可以通过

声明
supprimer_fn cs_supprimer;

其实现定义如前

void cs_supprimer(conteneur_sommets *cs)
{
cs->supprimer(cs->donnees);
}

关于c - 在函数结构上静默 WCast-function-type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59041367/

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