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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка, что константа, в теле функции 
:(
    Опции темы
leniviy
Дата 4.9.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#define ACCEPT_CONST_EXPRR(e) ???

enum { E1 = 5 };

int main() {
  const int c = 0;
  int i;
  i = ACCEPT_CONST_EXPRR(1); // OK
  i = ACCEPT_CONST_EXPRR(E1); // OK
  i = ACCEPT_CONST_EXPRR(sizeof(int)); // OK
  i = ACCEPT_CONST_EXPRR(c); // ошибку компиляции мне здесь!
}


PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



макрос и так разворачивается в том месте где используется.
или в чем вопрос?
PM WWW   Вверх
leniviy
Дата 4.9.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вопрос в том, где компилятор C ожидает константу.
Это: enum, размер объявляемых массивов и инитиалайзер глобальных переменных (только C).

Вопрос в том, как в выражении проверить, является ли оно константой на момент компиляции.

Я, кажется, сам догадался: можно в макросе кастануть NULL в указатель на массив размером равным выражению.


Это сообщение отредактировал(а) leniviy - 4.9.2012, 15:11
PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(leniviy @  4.9.2012,  15:09 Найти цитируемый пост)
как в выражении проверить, является ли оно константой на момент компиляции.

отключить VLA, и проверяемую переменную использовать в качестве размера массива.

Код

#define STATIC_ASSERT(var, message) \
    typedef char __STATIC_ASSERT___##message##__[var]


Добавлено через 5 минут и 44 секунды
http://liveworkspace.org/code/cb044871679c...507a0309c598f75

Добавлено через 7 минут и 47 секунд
Цитата(boostcoder @  4.9.2012,  15:15 Найти цитируемый пост)
VLA

Variable length arrays

Добавлено через 10 минут и 17 секунд
вариант с использованием енума: http://liveworkspace.org/code/4632d103ad10...4f5786c88771204

Это сообщение отредактировал(а) boostcoder - 4.9.2012, 15:17
PM WWW   Вверх
leniviy
Дата 4.9.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  4.9.2012,  15:15 Найти цитируемый пост)
http://liveworkspace.org/code/cb044871679c...507a0309c598f75

Цитата(boostcoder @  4.9.2012,  15:15 Найти цитируемый пост)
вариант с использованием енума: http://liveworkspace.org/code/4632d103ad10...4f5786c88771204

Это не серьёзно. enum и typedef работают только в начале функции.
Надо вот так:

Код

#define ACCEPT_CONST_EXPRR(e) (   (void)(char (*)[1 + ((size_t)(e)-(size_t)(e))])0    ,(e))

enum { E1 = 5 };
int main() {
  const int c = 2;
  int i;
  double d;
  void *p;

  i = ACCEPT_CONST_EXPRR(4);
  i = ACCEPT_CONST_EXPRR(E1);
  i = ACCEPT_CONST_EXPRR(sizeof(int));
  d = ACCEPT_CONST_EXPRR(3.5);
  p = ACCEPT_CONST_EXPRR((void*)0x100000);
  i = ACCEPT_CONST_EXPRR(c);  // Error: expected constant expression
  return 0;
}




Это сообщение отредактировал(а) leniviy - 4.9.2012, 18:05
PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(leniviy @  4.9.2012,  16:05 Найти цитируемый пост)
enum и typedef работают

они не могу работать. по определению.

Цитата(leniviy @  4.9.2012,  16:05 Найти цитируемый пост)
enum и typedef работают только в начале функции.

как понимать "в начале функции" ?

PM WWW   Вверх
leniviy
Дата 4.9.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



их можно объявить только в начале функции или блока.



Это сообщение отредактировал(а) leniviy - 4.9.2012, 16:15
PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



ах епс. так ты ж на сях кодишь smile 
PM WWW   Вверх
leniviy
Дата 4.9.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не выбирал кодить на си. Кодить на си выбрало меня
PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



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

незавидная учесть, однако smile 

Это сообщение отредактировал(а) boostcoder - 4.9.2012, 16:26
PM WWW   Вверх
math64
Дата 4.9.2012, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 8
Всего: 72



Так добавь в макрос { } :
Код
#define ACCEPT_CONST_EXPR(e) { enum { a = (int)e }; }

и можешь пользоваться почти где угодно.
PM   Вверх
boostcoder
Дата 4.9.2012, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



math64, так его макрос еще и возвращает значение.

PM WWW   Вверх
math64
Дата 4.9.2012, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 8
Всего: 72



Вряд ли ему этот побочный эффект на самом деле нужен. Если нужен, можно вручную присвоить переменной 0 или вставить его присвоениее в код макроса.
А если если не нужен - никакого кода не генерится.
Но мoй код нельзя вставить между декларациями переменных.
PM   Вверх
leniviy
Дата 4.9.2012, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



VLA портят всю мою идею с кастом нуля в указатель на массив. Например, в gcc 4 этот код компилируется:
Код

int main(int argc, char *argv[]) {
    void * p = (char (*)[argc])0;
    return 0;
}

Но! Кастовать в енум тоже можно!
Код

int main(int argc, char *argv[]) {
    void * p2 = ( enum { a = argc }* )0; // error: enumerator value for 'a' is not an integer constant
    return 0;
}


PM MAIL   Вверх
boostcoder
Дата 4.9.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



leniviy, расскажи плиз, в какой задаче понадобился такой изврат?
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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