繁体   English   中英

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

[英]Prettiest way to declare a C array either fixed size or variable size?

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

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

问题是:在C语言中,我有哪些选择可以使这两种情况在同一代码中共存,同时保持代码干净?

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

我想过一种方法,您只需一个#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 ;否则, ARRAY_SIZE选择变量V 或固定大小S (如果在嵌入式环境中)。

MISRA-C:2004禁止使用C99,因此禁止使用VLA,因此,如果您编写的是严格遵循标准的MISRA代码,则不能使用它们。 很有可能在即将发布的MISRA-C标准中明确禁止VLA。

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

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

这很可能是“最漂亮”的方式。 或者,您可以在带有VLA的C99中建立调试版本,然后在发行版本中将其更改为静态分配的阵列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM