我有一个只能由一个函数访问的结构。该函数将诸如“k、K、kb、KB、m、M、mb、MB”之类的标记转换为实际单位。其目的是简化配置文件。
因此,假设我们有:
static uint32_t real_unit(const char *str)
{
struct u2type {
char key[3];
uint32_t val;
} const u2types[] = {
{ "k", KB_UNIT },
{ "K", KB_UNIT },
{ "kb", KB_UNIT },
{ "KB", KB_UNIT },
{ "m", MB_UNIT },
{ "M", MB_UNIT },
{ "mb", MB_UNIT },
{ "MB", MB_UNIT },
{ "g", GB_UNIT },
{ "G", GB_UNIT },
{ "gb", GB_UNIT },
{ "GB", GB_UNIT },
{ { 0 }, 0 }
};
... code to look up str ...
}
我看过其他程序,其中u2type结构体会被声明为静态的(再次在函数内部),但我看不出这有什么用处。该结构体不会改变,每次进入函数时它都是相同的。这就是为什么我将其设置为const的原因。
然而,我已经看到很多人在函数内部做类似于“static struct foo { ... } const foos[] = { ... }”的事情,其中范围显然是明确的。
这样做有什么好处吗?我试图在来到SO之前研究ASM输出,以解决这些优化问题,但我不是一个汇编大师 :)
编辑:
是的,我知道这种方法很奇怪。一些项目只是有奇怪的要求(通常是由奇怪的人强制执行的)。然而,问题与函数的使用完全无关。
static const
,它甚至可以被定位在代码段中(或附近),并且在运行时不需要额外的存储空间以及初始值。在嵌入式环境中,ROM 中只有代码而几乎没有可用 RAM 时,这一点可能非常重要。 - RBerteig