c - 使用 C 宏在代码中很好地组合两个选项

标签 c macros kernel driver alsa

我有一些 ALSA 驱动程序代码,其中有许多行必须更改才能在两种音频配置之间切换:L/R 立体声和单声道,但我想要一个开关来在 L/R 模式或单声道模式之间进行选择。我目前有两个文件,一个用于 L/R,一个用于单声道,但缺点是必须使用相同的更新来维护这两个文件。将所有内容都放在一个文件中会很好,因为两者之间有很多相似之处。

例如:

左/右立体声:

regmap_read(WM88->regmapL, addr, &val_l);
regmap_read(WM88->regmapR, addr, &val_r);
pr_info("%s: reg 0x%02X, val_l 0x%02X, val_r 0x%02X\n",
__func__, addr, val_l, val_r);

单声道:

regmap_read(WM88->regmapL, addr, &val_l);
pr_info("%s: reg 0x%02X, val_l 0x%02X\n",
__func__, addr, val_l);

一个选择是有一堆#ifdef#endif block ,但它看起来很丑陋。有一个更好的方法吗?它不一定是宏,但我认为这可能是最好的方法。

最佳答案

因为你指定了 C:

将每个配置的代码放入一个单独的子例程中。

创建一个函数指针数组(在本例中有两个元素,一个用于立体声,一个用于单声道)。将其命名为“FunctionArray”

使用当前选择的配置在数组中创建一个整数偏移量(0 或 1)。将其命名为“ConfigurationIndex”之类的名称

在主函数中调用 FunctionArray[ConfigurationIndex] 给出的函数。

这基本上是一个奇特的“if”语句,但它允许您添加任意多的不同选项。

关于c - 使用 C 宏在代码中很好地组合两个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22567563/

相关文章:

c - 使用 C 预处理器生成多个相似的函数

C++:将基于宏的属性系统转换为使用模板

不能包含 linux/cred.h 头文件 : "No such file or directory"

c - 命令行参数的数据类型

c - 为什么我的程序在嵌套时会生成随机结果?

c - linux 中对 pthread_create 的 undefined reference (c 编程)

c - 为什么我的 c 中的 mmap 无法正常工作?

c - 宏初始化不清楚

C 内核 - 在 VM 上运行良好但在实际计算机上运行不正常?

windows - GUI 是 Windows Serial 中 WinTER 的一部分吗?