提问人:ObiBabobi 提问时间:11/15/2023 最后编辑:ObiBabobi 更新时间:11/15/2023 访问量:61
如何在 C 中区分特定代码和泛型代码 [已关闭]
How to separate specific from generic code in C [closed]
问:
在准备添加对另一种架构的支持时,我目前正在研究将特定于架构的代码与 linux 内核模块中的通用代码分开。到目前为止,我的方法是将所有特定于 arch 的东西放在一个单独的文件夹中,然后使用 .举例来说,我当前设置的简化版本:Makefile
我的目录层次结构:
.
├── arch
│ └── x86
│ ├── arch-specific.h
│ └── arch-specific.c
├── generic.h
├── generic.c
└── Makefile
我:Makefile
obj-m += module.o
module-y := generic.o arch/$(ARCH)/arch-specific.o
...
到目前为止,我真的很喜欢这个设置,因为它允许我轻松、干净地切换架构。此外,多亏了它,我不需要任何预处理器指令来实现我想要的东西。我在泛型代码中需要的函数定义只是从已编译的任何体系结构中获取。不幸的是,我似乎已经遇到了这种方法可以做的极限。
请看一下两个头文件的当前状态:
arch-specific.h
:
#ifndef ARCH_SPECIFIC_H
#define ARCH_SPECIFIC_H
struct arch_specific_attributes
{
u64 arch_specific_attribute;
};
#include "../../generic.h"
#endif
generic.h
:
#ifndef GENERIC_H
#define GENERIC_H
struct all_attributes
{
u64 generic_attribute;
struct arch_specific_attributes arch_spec_attr;
};
#endif
只要我只需要在 中的这些头文件中所做的声明,这就可以了。
但是一旦我需要输入类型,例如用于通用处理,我就会遇到问题。这是因为目前我既不能直接包含(由于缺少 的声明),也不能(由于不知道架构)。arch-specific.c
struct all_attributes
generic.c
generic_attribute
generic.h
struct arch_specific_attributes
arch-specific.h
到目前为止,我已经想到了 3 个选项:
- 通过预处理器指令直接包含
generic.h
generic.h
:
#ifndef GENERIC_H
#define GENERIC_H
#ifndef ARCH_SPECIFIC_H
struct arch_specific_attributes {};
#endif
struct all_attributes
{
u64 generic_attribute;
struct arch_specific_attributes arch_spec_attr;
};
#endif
这编译并且现在也有效。尽管如此,这似乎是未来令人头疼的可能原因,例如,如果我声明了一个 .可能是个坏主意。struct all_attributes
- 通过以下方式直接包含
generic.h
void*
generic.h
:
#ifndef GENERIC_H
#define GENERIC_H
struct all_attributes
{
u64 generic_attribute;
void* arch_spec_attr;
};
#endif
这应该比选项 1 更可靠,但创建实例会更麻烦,并且访问需要转换指针,这也不是很好。struct all_attributes
arch_spec_attr
- 有条件地包括使用预处理器指令
arch-specific.h
在而不是generic.c
#include "generic.h"
做
#ifdef ARCH_X86
#include "arch/x86/arch-specific.h"
#endif
然后为要支持的每个体系结构添加其中一个块。 考虑到一切,这似乎是要走的路。不利的一面是,我必须在代码的通用部分需要特定于架构的声明的任何地方执行此操作,这最终可能会很多。
我觉得一定有比这些选择更好的方法。 我找不到任何关于这方面的指导,但由于这是用于 linux 内核的,我想有一些官方首选方法可以做到这一点。 谁能为我指出正确的方向?
答: 暂无答案
评论