Ну если у вас BIG_ENDIAN, тогда да, так не прокатит... Не проще тогда в run time это сформировать?
ну или просто не заморачиваться и сделать что-то типа такого, будет независимо от ENDIAN
#define TEXT_STRING "MyString"
const uint8_t product_string[2*sizeof(TEXT_STRING)/sizeof(TEXT_STRING[0])] = {
sizeof(product_string),
STRING_DESCRIPTOR_TYPE,
#if (sizeof(product_string) > 2)
(uint8_t)(TEXT_STRING[0]), 0,
#endif
#if (sizeof(product_string) > 4)
(uint8_t)(TEXT_STRING[1]), 0,
#endif
#if (sizeof(product_string) > 6)
(uint8_t)(TEXT_STRING[2]), 0,
#endif
// .... и т.д. в зависимости от максимальной длинны
};