![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
Здравствуйте!
Меня интересует такой вопрос, возможно ли статически проверить, что тип type1 является typedef'ом типа type2 среднствами ANSI C. Мне надо нечто типа такого:
Соответсвенно, хотелось бы увидеть ошубку компиляции, если кто-то, когда-то изменит typedef типа type1. Возможно ли это сделать средствами ANSI C? define'ами всякими и тд... Спасибо. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Добавлено через 13 минут и 16 секунд правда, это не стандартный способ. это расширения GCC. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ну и статик ассерт:
|
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
boostcoder, спасибо, то, что надо!
Это, конечно, проблема. Но, если существуют такие же штуки под используемыми платформами, то она решаема. Поэтому буду очень благодарен, если кто сообщит есть ли подобные возможности у компиляторов: Visual Studio 2010 Solrais (стандартный комплятор операционки) AIX (стандартный комплятор операционки) HP-UX (стандартный комплятор операционки) |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Может быть достаточна неполная проверка, но зато работающая везде?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
math64,
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Не заметил, что нужно на C. Но суть идеи можно реализовать на C - проверить размеры типов на равенство и возможность копирования из type1* в type2* (для C++ тоже надо сравнивать указатели, для классов могут быть переопределены операторы присваивания) и наоборот
Код можно генерировать в #define вместо template, но будет генерироваться ненужный код (в C++ функцию можно объявить inline код для неё генерироваться не будет, если нет вызовов) |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
math64, даже ваш плюсовый вариант какой-то странный...
в плюсах, этот способ будет работать везде и всегда.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Мой код непродуманный, он только иллюстрирует идею.
Ваш код лучший для C++ - он отличит даже char& от char, если убрать генерацию имени переменной из имён типов (что было сделано чтобы получить более понятное сообщение об ошибке) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вот решение для C (не C++):
Если типы type1 и type2 одинаковы, можно делать сколько угодно объявлений функции dummy Если типы разные, перегрузка функций в C запрещена, получите ошибку. Для того, чтобы оформить макрос, нужно придумать как сгенерировать уникальное имя функции, но такой код просто написать и без макроса. Это сообщение отредактировал(а) math64 - 30.9.2011, 16:22 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Решение как для C, так и для C++
Иметь разные возвращаемые типы при одинаковых параметрах запрещено в обоих языках |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
math64, это действительно правильное решение! держи плюс!
Добавлено @ 17:44
вывод:
Это сообщение отредактировал(а) boostcoder - 30.9.2011, 17:48 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Для C может быть неточная работа если сравниваются указатели на функцию
C посчитает эти указатели совместимыми первое определение - функция возврщает int, аргументы любые вторая фукнция требует аргумента int В C++ будет ошибка: первый указатель на функцию без аргументов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |