У меня есть структура, к которой должен иметь доступ только одна функция. Функция преобразует токены, такие как «k, K, kb, KB, m, M, mb, MB, ...» в фактическую единицу. Целью этого является упрощение файла конфигурации.Объявление структур внутри функций в C
Итак, предположим, что мы имеем:
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.
Тем не менее, я видел, что многие люди делают statc struct foo {...} const foos [] = {...}, в пределах функции, где область видимости очевидна.
Есть ли какая-либо польза для этого? Я пытаюсь изучить вывод ASM до прихода к SO с оптимизации подобные вопросы, но я не собрание гуру :)
EDIT:
Да, я знаю, что этот подход пахнет ноги. Некоторые проекты имеют странные требования (как правило, нечетные люди). Однако вопрос остается полностью отделенным от использования функции.
Что запрещает компилятор построения константных версий только один раз, а? – aib
В C я не уверен, что что-то делает, но это, безусловно, не требуется. – 2009-03-25 15:24:42
Если объявлен 'static const', он может даже попасть в (или рядом) сегмент кода и не требовать хранения во время выполнения в дополнение к его начальному значению. Это может иметь большое значение во встроенных средах с кодом в ПЗУ и почти без ОЗУ. – RBerteig