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

时间:2014-03-21 19:11:41

标签: c macros kernel driver alsa

我有一些ALSA驱动程序代码,有许多行必须改变,以便在两种音频配置之间进行更改:L / R立体声和单声道,但我想在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块,但它看起来很难看。有一个更好的方法吗?它不一定是一个宏,但我认为这可能是最好的方法。

1 个答案:

答案 0 :(得分:0)

由于您指定了C:

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

创建一个函数指针数组(在这种情况下有两个元素,一个用于Stereo,另一个用于Mono)。将其命名为" FunctionArray"

使用当前选定的配置在数组中创建整数偏移量(0或1)。将其命名为" ConfigurationIndex"

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

这基本上是一种幻想,如果'声明,但它允许您添加任意数量的不同选项。