Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение длины строки до компиляции, функции препроцессора 
:(
    Опции темы
fish9370
Дата 29.12.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Код

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


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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cheloveck
Дата 29.12.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



эмм... ты же можешь посчитать сам
Код

#define GETMATCHCOUNT "GETMATCHCOUNT"
#define GETMATCHCOUNT_LENGTH 13



--------------------
user posted image
PM Jabber   Вверх
fish9370
Дата 29.12.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



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


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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cheloveck
Дата 29.12.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



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

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


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 29.12.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
null56
Дата 30.12.2010, 01:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



на базе сказанного 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:12
PM MAIL   Вверх
null56
Дата 30.12.2010, 06:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



или еще правильнее, наверное, использовать концепцию известного макроса 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));


Это сообщение отредактировал(а) null56 - 30.12.2010, 06:42
PM MAIL   Вверх
fish9370
Дата 30.12.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



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

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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
null56
Дата 30.12.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



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

только константной, размер которой известен на стадии компиляции
PM MAIL   Вверх
mes
Дата 30.12.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.