如何在编译期间检查C函数的有效输入?

Ada*_*dam 6 c embedded compiler-errors

我正在为微控制器编写嵌入式C代码.代码必须在三个不同的电路板之间共享,输入/输出配置在初始化期间从某些表的运行时设置.

微控制器有24个ADC通道,我有一个功能,可以将引脚设置或清除为ADC通道.这意味着函数的输入可以包含0到23(在表中设置)而不包含任何其他内容.

我想放一些预处理器或编译器"东西",可以识别该函数收到的值不是0-23,并抛出某种错误或警告,并防止代码编译,以防有人将无效值放入桌子.

有没有人对如何最好地做这个有一些建议?

lla*_*ais 3

在大多数编译器(预处理器)上,您可以使用该#error指令。

IE

#define ADC_CHANNEL 34
#if ADC_CHANNEL > 23
#error ADC_CHANNEL exceeds maximum allowed value
#endif
Run Code Online (Sandbox Code Playgroud)

上面的代码会抛出错误,并且无法编译。

然后使用 ADC_CHANNEL 作为函数的输入。

或者您可以创建ADC_CHANNEL,enum并定义ADC_CHANNEL_0 = 0, ADC_CHANNEL_1 = 1... ADC_CHANNEL_23 = 23。然后让你的函数采用 type ADC_CHANNEL_t,或者任何你想调用它的东西,这样,如果使用枚举类型作为参数调用函数,将无法使用越界值。

例子:

typedef enum {ADC_CHANNEL_0 = 0,
              ADC_CHANNEL_1 = 1,
              ADC_CHANNEL_2 = 2,
              // ...etc...
              ADC_CHANNEL_22 = 22,
              ADC_CHANNEL_23 = 23} adc_channel_t;

void setClearAdcPin(adc_channel_t adcChannel) {
    // ...function body...
}
Run Code Online (Sandbox Code Playgroud)

(从技术上讲,您不需要= 0= 1等,因为编译器会根据顺序推断出这一点。默认情况下enums 从 0 开始,每个值递增 1。但是手动定义每个值更安全,并且可以让您做一些事情就像只包括您可能使用的 3 个可能的 ADC 通道,即使它们不是连续的。)