C 将常量与typedef和函数指针一起使用时出现问题
这是一个MREC 将常量与typedef和函数指针一起使用时出现问题,c,pointers,constants,typedef,C,Pointers,Constants,Typedef,这是一个MRE #include <string.h> typedef char* mytype; typedef int(*cmp)(const mytype, const mytype); void foo(cmp f) {} int main(void) { foo(strcmp); } 第一个警告无关紧要。但是我该怎么处理第二个呢?我尝试将typedef更改为: typedef int(*cmp)(mytype const,mytype const); 但
#include <string.h>
typedef char* mytype;
typedef int(*cmp)(const mytype, const mytype);
void foo(cmp f) {}
int main(void) {
foo(strcmp);
}
第一个警告无关紧要。但是我该怎么处理第二个呢?我尝试将typedef更改为:
typedef int(*cmp)(mytype const,mytype const);
但这给出了完全相同的结果。当我改为:
typedef int(*cmp)(const char*, const char*);
它起作用了,但出于明显的原因,这并不可取。另一个可行但不可取的方法是:
typedef const char* mytype;
typedef int(*cmp)(mytype, mytype);
我错过了什么
我试图解决的问题是,我想创建一个通用结构,其中的数据类型为mytype
。该结构的用户需要实现一个比较函数,但我希望它能与strcmp
一起工作,以防mytype
是char*
类型
请注意,mytype
不一定需要是指针。这取决于用户指定的数据类型。另外,我知道Type Debug指针一般都是不好的实践,但是我认为这是一个特殊的情况,因为我想Type不管类型是什么,它可能是一个指针。
结构如下所示:
struct node {
struct node *next;
mytype data;
};
我设法用#define mytype char*
解决了这个问题,但这感觉非常难看,我更希望有其他方法。我希望它是可移植的,所以我不想使用gcc扩展
typedef char* mytype;
mytype
是指向char
的指针const mytype
是指向字符的常量指针,而不是指向常量字符的指针
不幸的是,在C语言中,您不能使用typedef指针,而使用此类型来声明指向const
对象的指针
你需要
typedef int(*cmp)(const char *, const char *);
void foo(cmp f) {}
int main(void) {
foo(strcmp);
}
或
顺便说一句,在typedef后面隐藏指针是一种非常糟糕的做法
mytype
是指向char
的指针const mytype
是指向字符的常量指针,而不是指向常量字符的指针
不幸的是,在C语言中,您不能使用typedef指针,而使用此类型来声明指向const
对象的指针
你需要
typedef int(*cmp)(const char *, const char *);
void foo(cmp f) {}
int main(void) {
foo(strcmp);
}
或
顺便说一句,在typedef后面隐藏指针是一种非常糟糕的做法。您遗漏了什么:这是否回答了您的问题?
mytype
的typedef应该是typedef char mytype
这样mytype
实际上是一个类型,而不是指向类型的指针。然后函数的typedef是typedefint(*cmp)(const mytype*,const mytype*)
当mytype
只是一个类型时,您可以完全控制装饰程序的排序建议您检查qsort()
函数的源代码,因为这需要用户编写比较函数。您遗漏了什么:这是否回答了您的问题?mytype
的typedef应该是typedef char mytype
这样mytype
实际上是一个类型,而不是指向类型的指针。然后函数的typedef是typedefint(*cmp)(const mytype*,const mytype*)
当mytype
只是一个类型时,您可以完全控制装饰程序的排序建议您检查qsort()
函数的源代码,因为这需要用户编写比较函数。因此,我想做的是不可能的?是的,如果不违反某些规定,这是不可能的。cast只隐藏了这个问题。但是,我写的不是TyPulf指针。@ KLUTT是想在C中发明C++,为什么你只是不使用C++。因为我打算用C写这个,这个小的特性是唯一阻止我的东西。所以我想做的是不可能的?是的,不违反某些东西是不可能的。cast只隐藏了这个问题。但是,我写的不是TyPulf指针。@ KLUTT是想在C中发明C++,为什么你只是不使用C++。因为我打算用C写这个,这个小的特性是唯一能阻止我的东西。
foo((cmp)strcmp);