Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > определение длины строки до компиляции


Автор: fish9370 29.12.2010, 11:24
Код

if (strncmp(buff, "GETMATCHCOUNT", strlen("GETMATCHCOUNT")) == 0) {
}


в этом небольшом коде длина строки вычисляется во время работы программы, но строка "GETMATCHCOUNT" является константой, можно ли как-то получить длину константной строки во время работы препроцессора?

Автор: Cheloveck 29.12.2010, 11:57
эмм... ты же можешь посчитать сам
Код

#define GETMATCHCOUNT "GETMATCHCOUNT"
#define GETMATCHCOUNT_LENGTH 13

Автор: fish9370 29.12.2010, 12:32
Цитата(Cheloveck @  29.12.2010,  11:57 Найти цитируемый пост)
эмм... ты же можешь посчитать сам


могу, но я боюсь обсчитаться.. предположем, таких проверок у меня будет несколько.. а выявлять подобные ошибки потом затруднительно..

Автор: Cheloveck 29.12.2010, 13:16
Цитата(fish9370 @  29.12.2010,  11:24 Найти цитируемый пост)
ожно ли как-то получить длину константной строки во время работы препроцессора? 

нет, препроцессор работает с кодом программы, а не с его структурными единицами.

Автор: mes 29.12.2010, 14:28
Цитата(fish9370 @  29.12.2010,  10:24 Найти цитируемый пост)
, можно ли как-то получить длину константной строки во время работы препроцессора? 

можно чуть позже, однако без затрат рантайма : см. sizeof ()

Автор: null56 30.12.2010, 01:33
на базе сказанного mes
Код

#include <stdio.h>

#define STR "My char string"
#define WSTR L"My wchar string"

#define STR_LEN(type, s) \
           ((sizeof(s) / sizeof(type)) - 1)

#define LEN_OF_CHAR STR_LEN(char, STR)
#define LEN_OF_WCHAR STR_LEN(wchar_t, WSTR)

int main()
{
        printf("%lu\n", STR_LEN(char, STR));
        printf("%lu\n", STR_LEN(wchar_t, WSTR));
        printf("%lu\n", LEN_OF_CHAR);
        printf("%lu\n", LEN_OF_WCHAR);
        return 0;
}


Вывод:
Цитата

14
15
14
15


ЗЫ: тема мало чем относится к программированию под никс, скорее общие вопросы

Автор: null56 30.12.2010, 06:40
или еще правильнее, наверное, использовать концепцию известного макроса ARRAY_OF
Код

#define ARRAY_OF(a) \
        ((sizeof(a) / sizeof(a[0])) - 1)

//..
        printf("Array of: %lu\n", ARRAY_OF(STR));
        printf("Array of: %lu\n", ARRAY_OF(WSTR));

Автор: fish9370 30.12.2010, 10:26
не думал, что с помощью sizeof() можно определить длину строки, пусть даже и константной.. ну если это так, то вы мне действительно помогли.. 

буду проверять..

Автор: null56 30.12.2010, 13:58
Цитата(fish9370 @  30.12.2010,  10:26 Найти цитируемый пост)
не думал, что с помощью sizeof() можно определить длину строки, пусть даже и константной..

только константной, размер которой известен на стадии компиляции

Автор: mes 30.12.2010, 17:36
Цитата(null56 @  30.12.2010,  12:58 Найти цитируемый пост)
только константной, размер которой известен на стадии компиляции 

слово "константной" тут лишнее..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)