如何在 C 中区分特定代码和泛型代码 [已关闭]

How to separate specific from generic code in C [closed]

提问人:ObiBabobi 提问时间:11/15/2023 最后编辑:ObiBabobi 更新时间:11/15/2023 访问量:61

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

5天前关闭。

这篇文章在 5 天前被编辑并提交审核,未能重新打开帖子:

原始关闭原因未解决

在准备添加对另一种架构的支持时,我目前正在研究将特定于架构的代码与 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.cstruct all_attributesgeneric.cgeneric_attributegeneric.hstruct arch_specific_attributesarch-specific.h

到目前为止,我已经想到了 3 个选项:

  1. 通过预处理器指令直接包含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

  1. 通过以下方式直接包含generic.hvoid*

generic.h:

#ifndef GENERIC_H
#define GENERIC_H

struct all_attributes
{
    u64 generic_attribute;
    void* arch_spec_attr;
};

#endif

这应该比选项 1 更可靠,但创建实例会更麻烦,并且访问需要转换指针,这也不是很好。struct all_attributesarch_spec_attr

  1. 有条件地包括使用预处理器指令arch-specific.h

在而不是generic.c

#include "generic.h"

#ifdef ARCH_X86
#include "arch/x86/arch-specific.h"
#endif

然后为要支持的每个体系结构添加其中一个块。 考虑到一切,这似乎是要走的路。不利的一面是,我必须在代码的通用部分需要特定于架构的声明的任何地方执行此操作,这最终可能会很多。

我觉得一定有比这些选择更好的方法。 我找不到任何关于这方面的指导,但由于这是用于 linux 内核的,我想有一些官方首选方法可以做到这一点。 谁能为我指出正确的方向?

c 设计模式 linux 内核 内核模块

评论


答: 暂无答案