作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到以下警告:
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/
我是一名优秀的程序员,十分优秀!