我正在为算法编写一个小C代码。主要目标是嵌入式微控制器,但是,出于测试目的,需要Matlab / Python接口。
我遵循嵌入式编程标准(MISRA-C 2004),该标准要求使用C90,并且不鼓励使用malloc
和朋友。因此,代码中的所有数组都在编译时分配了内存。如果更改输入数组的大小,则需要重新编译代码,这在微控制器方案中是正常的。
但是,在使用Matlab / Python进行原型设计时,输入数组的大小会经常变化,并且每次重新编译似乎都不是一个选项。在这种情况下,可以使用C99,并且应该在运行时确定数组的大小。
问题是:我在C中有哪些选项可以使这两个场景在同一代码中共存,同时保持代码清洁?
我必须强调,我主要关注的是如何使代码易于维护。我已经考虑使用 #ifdef 来获取静态分配的数组或动态分配的数组。但是有太多的数组,我认为 #ifdef 使代码看起来很难看。
答案 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进行调试构建,然后将其更改为发布版本中静态分配的数组。