c - 编译时硬限制参数值

标签 c c-preprocessor buffer-overflow

假设我们有一个数组:

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/

相关文章:

c - 通过编辑 omni.ja 移动 Firefox 13 的起始页元素会导致 FF 崩溃,有人知道如何正确执行此操作吗?

c - Valgrind block 丢失

c - 每个 block 的最大线程数

gcc - 为什么要在项目中使用#include_next?

C嵌入错误: ‘XXXX’ declared as function returning a function

由于预处理器指令导致的 SWIG 错误

c++ - 分配给 int 类型缓冲区的大内存大小

c - 为什么这段代码通过了编译器并成为验证码?

c - 通过尝试访问大于 C 中数组维度的位置来访问数组后面的变量

c - 堆栈缓冲区溢出文章中的奇怪地址