c - 头文件中的 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 结构及其所有功能。
但是,这违背了在头文件中仅使用声明(而不是实现)的正常做法。所以,我有一些问题:
- 有没有更好的方法来获得这样的简单内含物?通过一些搜索,似乎包含 .c 文件是一个坏主意。
- 我现在正在做的事情以我没有意识到的方式是坏的/危险的吗?
解决方案
关于您的第一个问题,标准方法是仅以另一个.c
文件或静态库的形式链接代码。但你也可以inline
用于一切。(虽然我不认为这对于更大的数据结构来说是一个好的解决方案。)
关于您的第二个问题,一个危险是,如果您尝试将已使用此头文件单独编译的两个(或多个)编译文件链接在一起,则会出现链接器错误。ll_init
符号将由每个文件.o
定义。
推荐阅读
- java - 来自java的Postgres存储过程调用,要返回的表
- java - hasNextInt 不会返回 false 并退出循环
- sql - 如何将 NativeScript 应用程序连接到 SQL 数据库?
- html - HTML5 CSS3 在包含图像的单元格上浮动输入文本
- mysql - 创建 Mysql 过程
- node.js - any-db-sqlite3 如何/在哪里将数据库保存到?
- matlab - 未将输出参数分配给子功能程序时如何解决
- android - ObjectAnimator,如何移动对象两次?
- spring - 如何分别为多个控制器在多个文件中编写Spring Boot测试用例
- caching - 创建/更新/删除后如何清除 .Net Core 上的响应缓存?