别名为函数的新名称(C)

时间:2014-11-27 11:49:13

标签: c linked-list queue alias typedef

我一直在尝试在C中实现队列结构,使用C中链接列表的另一种实现。

我已经在linked_list.h中定义了队列所需的一些函数,我想为它们别名一个新名称;例如,为create_list()创建别名create_queue()。

因为我对C编程很新,所以我在网上查找了一种方法来实现这一点,我遇到了函数指针的主题。这似乎是做我想要的正确方式,但是当我尝试它时:

#include "linked_list.h"

typedef list_t queue_t; // list_t is the list type defined in linked_list.h,
                        // as well as the functions such as create_list()

queue_t (*create_queue)() = NULL; // Setting the function pointer to NULL
create_queue = &create_list; // Aliasing create_queue() for create_list()

当我尝试编译时,我收到错误并发出警告:

  • 错误:使用不同类型重新定义'create_queue':'int'vs'queue_t(*)()'
  • 警告:缺少类型说明符,默认为'int'

我的代码中缺少什么?我不想完全解决我的问题,只需要以正确的方式重定向。


这是create_list():

list_t create_list(){
/* Creates and returns a NULL list, with index and value zeroed */
list_t list;
malloc(sizeof(list_t));

list.global_index = 0; /* Global index to keep how many nodes in the list, since no loops are allowed */
list.total_value = 0; /* Total value to keep total value of nodes in the list, since no loops are allowed */
list.head = NULL;
list.last = NULL;

return list;
}

结构定义:

struct int_node {
int value;
struct int_node * previous; /* Needed to go to previous nodes with no loops */
struct int_node * next;
};

struct int_list {
int global_index;
int total_value;
struct int_node * head;
struct int_node * last;
};

/* Typedefs */
typedef struct int_node node_t;
typedef struct int_list list_t;

2 个答案:

答案 0 :(得分:2)

尝试替换这些行:

queue_t (*create_queue)() = NULL; // Setting the function pointer to NULL
create_queue = &create_list; // Aliasing create_queue() for create_list()

这一行:

queue_t (*create_queue)() = &create_list; // Aliasing create_queue() for create_list()

我编译没有错误。

答案 1 :(得分:1)

如果链接列表中存在相同的函数,则执行此操作的正确方法是创建函数包装器。例如,如果你有

void linklist_add (int x);

并且想要创建一个queue_add函数,你可以实现它:

void queue_add (int x)
{
  linklist_add(x);
};

从“linklist_t”到“queue_t”等的任何类型转换都可以在包装函数内部处理。

现在看完这篇文章后,至少有十个人会立即开始尖叫额外的函数调用开销。 不要担心这个!编译器可能会优化或内联函数。即使它没有,额外的函数调用开销也可以忽略99%的所有系统。

努力使代码尽可能可读,这应该始终是主要关注点。简单的解决方案通常是最佳解决方案。优化是您应该在实际需要时才考虑的事项。

函数指针有效,但它必须是一个全局变量,这很少是一个好主意。此外,函数指针往往会生成不可读的代码,尤其是当您不键入它们时。函数指针应该用于泛型编程,而不是用于调用者接口。