![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
макрос и так разворачивается в том месте где используется.
или в чем вопрос? |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
вопрос в том, где компилятор C ожидает константу.
Это: enum, размер объявляемых массивов и инитиалайзер глобальных переменных (только C). Вопрос в том, как в выражении проверить, является ли оно константой на момент компиляции. Я, кажется, сам догадался: можно в макросе кастануть NULL в указатель на массив размером равным выражению. Это сообщение отредактировал(а) leniviy - 4.9.2012, 15:11 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
отключить VLA, и проверяемую переменную использовать в качестве размера массива.
Добавлено через 5 минут и 44 секунды http://liveworkspace.org/code/cb044871679c...507a0309c598f75 Добавлено через 7 минут и 47 секунд Variable length arrays Добавлено через 10 минут и 17 секунд вариант с использованием енума: http://liveworkspace.org/code/4632d103ad10...4f5786c88771204 Это сообщение отредактировал(а) boostcoder - 4.9.2012, 15:17 |
||||
|
|||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Это не серьёзно. enum и typedef работают только в начале функции. Надо вот так:
Это сообщение отредактировал(а) leniviy - 4.9.2012, 18:05 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
они не могу работать. по определению. как понимать "в начале функции" ? |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
их можно объявить только в начале функции или блока.
Это сообщение отредактировал(а) leniviy - 4.9.2012, 16:15 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ах епс. так ты ж на сях кодишь
|
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Я не выбирал кодить на си. Кодить на си выбрало меня
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да, педросы что-то вроде такого же говорят. типа: я в жопу трахаться не выбирал. в жопу траться выбрало меня.
незавидная учесть, однако Это сообщение отредактировал(а) boostcoder - 4.9.2012, 16:26 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Так добавь в макрос { } :
и можешь пользоваться почти где угодно. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
math64, так его макрос еще и возвращает значение.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вряд ли ему этот побочный эффект на самом деле нужен. Если нужен, можно вручную присвоить переменной 0 или вставить его присвоениее в код макроса.
А если если не нужен - никакого кода не генерится. Но мoй код нельзя вставить между декларациями переменных. |
|||
|
||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
VLA портят всю мою идею с кастом нуля в указатель на массив. Например, в gcc 4 этот код компилируется:
Но! Кастовать в енум тоже можно!
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
leniviy, расскажи плиз, в какой задаче понадобился такой изврат?
|
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Я искал способ решения этого вопроса для C: http://forum.vingrad.ru/forum/topic-355730.html только сгенерить автоматическое имя енуму нельзя. __LINE__ не вариант. Был бы __COUNTER__ в gcc, но почему-то не добавили. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Значит меня ввели в заблуждение
http://www.pixelbeat.org/programming/gcc/static_assert.html Впрочем, проект, который я сапорчу, собирается на gcc 2.95.3 и переход на новую версию только планируется. Там нет __COUNTER__, а значит надо обойтись без енумов. Но в нём уже есть VLA, значит каст в указатель на массив тоже не подходит. Я не смог придумать, как в таком случае остановить компиляцию, если выражение не константа, но зато можно остановить линковку:
"1==1" - константа, и линкер не ругнется на отсутствие переменной nonexisting. Если вместо "1==1" использовать не константное выражение, то будет ошибка линковки. Добавлено @ 14:33 __COUNTER__ появился в gcc 4.3 Это сообщение отредактировал(а) leniviy - 8.9.2012, 14:34 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |