假设我们有一个数组:
struct some array[] = {A, B, C, D};
假设我们有一个函数,给定一个参数索引,用那个值做一些事情:
void sfrugula(size_t index){
do_it( &array[index] );
}
现在,我们知道我们希望几乎总是使用 STATIC 值而不是变量来调用该函数,例如:
sfugula(10);
有没有办法在编译时检查是否有溢出以及是否抛出错误?
重点是在编译时(如果可能的话)对参数进行硬限制和检查,因为这可能不仅适用于数组,甚至可能仅适用于某些变量。
最佳答案
这是我的解决方案,它使用枚举和 X 宏:
我创建了一个外部文件“ports.h”。 X() 的左边元素是“用户使用的好听的名字”,右边是对应的 REAL 值(或者它的唯一部分,如下所示)
#ifdef DDRA && PORTA && PINA
X(A, AAA)
#endif
#ifdef DDRB && PORTB && PINB
X(B, BBB)
#endif
然后在另一个文件中我声明了枚举(A、B、....)和指向实际元素的指针的并行数组(在这种情况下女巫是 my_AAA、my_BBB 等...)
#define SEP ,
#define X(a, b) a SEP
enum PORTS {
#include "ports.h"
};
#undef X
/* here we initialize the array of structure */
#define X(a, b) &my_##b SEP
static const uint8_t *array[] =
{
#include "ports.h"
};
#undef X
#undef SEP
最后只需更改我们的函数以使用枚举
void sfrugula(enum PORTS p){
do_it( &array[p] );
}
我必须做的唯一不同的事情是在使用函数时使用枚举而不是数值,但是如果我忘记了,编译器不会抛出警告;现在我正在寻找一些 typedef magic实现这一点(在 C++ 中,如果您使用“-Wenum-compare”就已经很好了,如果使用“-Wall”,女巫默认是这样的)
关于c - 编译时硬限制参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29231686/