声明固定大小或可变大小的C数组最漂亮的方法?

时间:2012-05-09 13:48:53

标签: c arrays embedded

我正在为算法编写一个小C代码。主要目标是嵌入式微控制器,但是,出于测试目的,需要Matlab / Python接口。

我遵循嵌入式编程标准(MISRA-C 2004),该标准要求使用C90,并且不鼓励使用malloc和朋友。因此,代码中的所有数组都在编译时分配了内存。如果更改输入数组的大小,则需要重新编译代码,这在微控制器方案中是正常的。 但是,在使用Matlab / Python进行原型设计时,输入数组的大小会经常变化,并且每次重新编译似乎都不是一个选项。在这种情况下,可以使用C99,并且应该在运行时确定数组的大小。

问题是:我在C中有哪些选项可以使这两个场景在同一代码中共存,同时保持代码清洁?

我必须强调,我主要关注的是如何使代码易于维护。我已经考虑使用 #ifdef 来获取静态分配的数组或动态分配的数组。但是有太多的数组,我认为 #ifdef 使代码看起来很难看。

2 个答案:

答案 0 :(得分:3)

我想到了一种只能使用一个#ifdef就可以逃脱的方法。我个人只是咬紧牙关并在需要时重新编译我的代码。使用不同方言的C进行制作和测试的想法让我有点紧张。

无论如何,这是你能做的。

#ifdef EMBEDDED
#define ARRAY_SIZE(V,S) (S)
#else
#define ARRAY_SIZE(V,S) (V)
#endif

int myFunc(int n)
{
    int myArray[ARRAY_SIZE(n, 6)];
    // work with myArray
}

如果不在嵌入式环境中,ARRAY_SIZE宏选择变量V;或者固定大小S,如果在嵌入式环境中。

答案 1 :(得分:1)

MISRA-C:2004禁止使用C99,因此禁止使用VLA,因此如果您正在编写符合严格要求的MISRA代码,则无法使用它们。在即将出台的MISRA-C标准中,很可能会明确禁止VLA。

是否可以选择不使用静态分配的未知大小的数组?那就是:

uint8_t arr[] = { ... };  
... 
n = sizeof(arr)/sizeof(uint8_t);

这很可能是“最漂亮”的方式。或者,您可以在C99中使用VLA进行调试构建,然后将其更改为发布版本中静态分配的数组。