如何解决将const与typedef和函数指针一起使用时出现问题
这是MRE
#include <string.h>
typedef char* mytype;
typedef int(*cmp)(const mytype,const mytype);
void foo(cmp f) {}
int main(void) {
foo(strcmp);
}
我编译时得到:
$ gcc mre.c -Wall -Wextra
mre.c: In function ‘foo’:
mre.c:7:14: warning: unused parameter ‘f’ [-Wunused-parameter]
7 | void foo(cmp f) {}
| ~~~~^
mre.c: In function ‘main’:
mre.c:10:9: warning: passing argument 1 of ‘foo’ from incompatible pointer type [-Wincompatible-pointer-types]
10 | foo(strcmp);
| ^~~~~~
| |
| int (*)(const char *,const char *)
mre.c:7:14: note: expected ‘cmp’ {aka ‘int (*)(char * const,char * const)’} but argument is of type ‘int (*)(const char *,const char *)’
7 | void foo(cmp f) {}
| ~~~~^
第一个警告不相关。但是我该怎么办?我尝试将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
不必一定是一个指针。这取决于用户指定的数据类型。另外,我知道类型定义指针通常是一种不好的做法,但是我认为这是一种特殊情况,因为无论类型是什么,我都想进行类型定义,而可能可能是指针。
结构如下:
struct node {
struct node *next;
mytype data;
};
我设法用#define mytype char*
解决了这个问题,但这感觉非常丑陋,如果有其他方法,我希望这样做。我希望它具有可移植性,所以我不想使用gcc扩展名。
解决方法
typedef char* mytype;
mytype
是指向char
的指针。 const mytype
是指向char的const指针,而不是指向const char的指针。
不幸的是,在C语言中,您不能使用typedef指针,也不能使用此类型来声明指向const
对象的指针。
您需要
typedef int(*cmp)(const char *,const char *);
void foo(cmp f) {}
int main(void) {
foo(strcmp);
}
或
foo((cmp)strcmp);
顺便说一句,将指针隐藏在typedef后面是非常糟糕的做法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。