Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将常量与typedef和函数指针一起使用时出现问题_C_Pointers_Constants_Typedef - Fatal编程技术网

C 将常量与typedef和函数指针一起使用时出现问题

C 将常量与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); 但

这是一个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);
但这给出了完全相同的结果。当我改为:

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);