【问题标题】:Using C macro to nicely combine two options in code使用 C 宏在代码中很好地组合两个选项
【发布时间】:2014-04-29 08:09:39
【问题描述】:

我有一些 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 块,但它看起来很丑陋。有一个更好的方法吗?它不一定是宏,但我认为这可能是最好的方法。

【问题讨论】:

标签: c macros kernel driver alsa


【解决方案1】:

既然你指定了 C:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2014-01-09
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多