2

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

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

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

我必须强调,我主要关心的是如何使代码易于维护。我考虑过使用#ifdef来获取静态分配的数组或动态分配的数组。但是数组太多了,我觉得#ifdef让代码看起来很难看。

4

2 回答 2

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,如果在嵌入式环境中。

于 2012-05-09T14:23:02.267 回答
1

MISRA-C:2004 禁止 C99 和 VLA,因此如果您正在编写严格符合 MISRA 代码,则不能使用它们。在即将发布的 MISRA-C 标准中,VLA 也很可能会被明确禁止。

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

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

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

于 2012-05-09T14:10:11.747 回答