首页 > 解决方案 > 头文件中的 C 函数实现

问题描述

我正在用 C 语言实现一些数据结构,目标是能够在未来的项目中轻松使用它们。一种可能的方法是在头文件中实现每个数据结构。

例如,这里是linked_list.h:

#ifndef LINKED_LIST
#define LINKED_LIST

#include <stdlib.h>


typedef struct linked_list_type {
   int val;
   struct linked_list_type* next;
} linked_list;



// Initializes a single node with a value v
linked_list* ll__init(int v) {
  linked_list* new_ll = malloc(sizeof(linked_list));
  new_ll->val = v;
  new_ll->next = NULL;

  return new_ll;
}

// More functions

#endif

这很好用,因为我可以#include "linked_list.h"在未来的项目中使用来获取linked_list 结构及其所有功能。

但是,这违背了在头文件中仅使用声明(而不是实现)的正常做法。所以,我有一些问题:

  1. 有没有更好的方法来获得这样的简单内含物?通过一些搜索,似乎包含 .c 文件是一个坏主意。
  2. 我现在正在做的事情以我没有意识到的方式是坏的/危险的吗?

标签: cheader-files

解决方案


关于您的第一个问题,标准方法是仅以另一个.c文件或静态库的形式链接代码。但你也可以inline用于一切。(虽然我不认为这对于更大的数据结构来说是一个好的解决方案。)

关于您的第二个问题,一个危险是,如果您尝试将已使用此头文件单独编译的两个(或多个)编译文件链接在一起,则会出现链接器错误。ll_init符号将由每个文件.o定义。


推荐阅读