微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将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 举报,一经查实,本站将立刻删除。