我正在为微 Controller 编写嵌入式 C 代码。代码必须在三个不同的电路板之间共享,输入/输出配置在运行时在初始化期间从一些表中设置。
微 Controller 有 24 个 ADC channel ,我有一个函数可以设置或清除一个引脚作为 ADC channel 。这意味着函数的输入可以由 0 到 23(在表中设置)组成,不能包含任何其他内容。
我想放置某种预处理器或编译器“东西”,它可以识别函数接收到的值不是 0-23,并抛出某种错误或警告,并防止代码编译,以防有人放置表中的值无效。
有没有人对如何最好地做到这一点有一些建议?
最佳答案
在大多数编译器(预处理器)上,您可以使用 #error
指令。
即
#define ADC_CHANNEL 34
#if ADC_CHANNEL > 23
#error ADC_CHANNEL exceeds maximum allowed value
#endif
上面会抛出一个错误,并且不会编译。
然后使用 ADC_CHANNEL 作为函数的输入。
或者您可以将ADC_CHANNEL
设为枚举
,并定义ADC_CHANNEL_0 = 0
、ADC_CHANNEL_1 = 1
.. .ADC_CHANNEL_23 = 23
。然后让你的函数采用 ADC_CHANNEL_t
类型,或者任何你想调用它的类型,这样如果使用枚举类型作为参数调用函数,将无法使用 out-of -边界值。
例子:
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...
}
(从技术上讲,您不需要 = 0
、= 1
等,因为编译器会根据顺序进行推断。默认情况下 enum
s 从 0 开始,每个值递增 1。但是手动定义每个值更安全,并且允许您做一些事情,比如只包括您可能使用的 3 个可能的 ADC channel ,即使它们不是连续的.)
关于c - 如何在编译期间检查 C 函数的有效输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237865/