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

标签 c compiler-errors embedded

我正在为微 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 = 0ADC_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/

相关文章:

c - 如何编写一个可以接受来自 CMD 行的参数的 makefile

interface - 实现一个没有错误的接口(interface)

debugging - 通过 Cortex-M3 CPU 上的 printf 进行输出调试,在 BKPT 指令处停顿 + 关于 JTAG 和 sw 端口的混淆

c - 小型嵌入式系统的好的脚本语言是什么?

c++ - 在特定地址存储答案

c - 如何查看 "char *str = "yoo 的内存"; "

c - 理解二维数组

C Webvserver – STDIN、套接字和 CGI​​ 管道

c - 使用Makefile编译时出现错误 "no such file or directory"

python - 是否可以使用python编译c代码?