Вы можете использовать назначенные инициализаторы для инициализации элементов elems[]
без необходимости знать явное значение каждого индекса индекса (или макроса).
const MyElements elems[] = {
[TOTO_IND] = {"TOTO", 18, "French"},
[TITI_IND] = {"TITI", 27, "English"},
[TATA_IND] = {"TATA", 45, "Spanish"},
};
Элементы массива будут инициализированы таким же образом, даже если вы измените порядок их появления в исходном коде:
const MyElements elems[] = {
[TITI_IND] = {"TITI", 27, "English"},
[TATA_IND] = {"TATA", 45, "Spanish"},
[TOTO_IND] = {"TOTO", 18, "French"},
};
Если длина массива устанавливается автоматически из инициализатора, как указано выше (т.е. используя []
, а не [NUM_ELEMS]
), тогда длина будет на единицу больше, чем максимальный индекс элемента.
Это позволяет вам сохранить значения индекса и внешнюю декларацию массива elems
в файле .h, а также определить содержимое массива elems
в отдельном файле .c.
Не существует универсального способа C ++ ПРИНУДИТЬ компилятор для создания встроенных функций. Обратите внимание на слово «подсказка» в процитированном вами тексте - компилятор не обязан вас слушать.
Если вам действительно абсолютно необходимо сделать что-то встроенным, вам понадобится ключевое слово, специфичное для компилятора, ИЛИ вы вам нужно будет использовать макросы вместо функций.
Как упоминал Майкл Кон, ключевое слово inline всегда является подсказкой, и GCC в случае вашей функции решил не встраивать его.
Поскольку вы используете Gcc, вы можете принудительно встроить его с помощью __attribute ((always_inline)).
Пример:
/* Prototype. */
inline void foo (const char) __attribute__((always_inline));
Источник: Встроенные документы GCC
Вы смотрите отладочную сборку (оптимизация отключена)? Компиляторы обычно отключают встраивание в «отладочные» сборки, потому что они усложняют отладку.
В любом случае, указанная строка inline
действительно является подсказкой . Компилятору не требуется встраивать функцию. Существует ряд причин, по которым любой компилятор может решить проигнорировать встроенную подсказку:
Это подсказка, и компилятор может игнорировать подсказку. Я думаю, что читал кое-где, что GCC обычно игнорирует это. Я помню, что слышал, что есть флаг, но он все равно не работает в 100% случаев. (Ссылку пока не нашел.)
Флаг: -finline-functions включен на уровне оптимизации -O3.
Inline ничего больше, чем предложение компилятору, что, если возможно встроить эту функцию, компилятор должен подумать об этом. Некоторые функции будут встроены автоматически, потому что они такие простые, и другие функции, которые вы предлагаете встраивать, не будет, потому что они слишком сложные.
Кроме того, я заметил, что вы выполняете отладочную сборку. На самом деле я не знаю, но возможно, что компилятор отключит встраивание для отладочных сборок, потому что это усложняет работу отладчика ...
Независимо от того, вставлять ли в строку, зависит от компилятора. Можно ли игнорировать подсказку inline ?
Я столкнулся с аналогичными проблемами и обнаружил, что это работает, только если встроенная функция записана в заголовочный файл.