Я ищу, чтобы найти длину литерала C-строки во время компиляции. Учитывая определения:Размер времени компиляции строкового литерала в массиве строковых литералов
static const char * const header_left[] =
{
" | | Raw | Raw |",
" | | Start | End |",
"Interval#| Duration | Point | Point |",
"---------+----------+-------+-------+",
};
const unsigned int rows_in_header = sizeof(header_left)/sizeof(header_left[0]);
Как найти длину строки буквального header_left[2]
без использования strlen
?
В этом вопросе Determining the Length of a String Literal есть комментарий, чтобы объявить массив как header_left[][4]
. Я предпочитаю не использовать этот вид декларации, так как существует тенденция к изменению количества строк без изменения константы количества. Мне нравится, когда компилятор вычисляет количество строк (см. Определение rows_in_header
) и длину каждой строки.
Это для встроенной системы, а строки - блок, написанный для последовательного порта. Функция последовательного порта принимает указатель на данные и длину данных в качестве параметров. Код последовательного порта оптимизирован для записи блоков. Предпочтение - не использовать strlen
, поскольку это отнимает время исполнения.
Я использую C99 с встроенной мастерской IAR на платформе ARM7TDMI.
Я включил тег c++
, потому что это также связано с C++, и мы будем переносить код на C++ после первого запуска продукта.
Таким образом, вы не можете изменить определение вообще? Например. макро магия или магия C++ .. – dyp
Для 'static const char * const header_left []' длина не имеет значения, так как это массив указателей. Возможно, вам понадобилось бы 'static const char header_left [] [sizeof" Interval # | Duration | Point | Point | "] = {...};'? –
@ DanielFischer: Нужно ли дублировать текст в вашем случае, один раз для 'sizeof' и другого времени между' 'и' ''? –