Re: C - Проверить тип (перенную) на указатель
От: ДимДимыч Украина http://klug.org.ua
Дата: 07.07.11 23:03
Оценка:
Здравствуйте, Vain, Вы писали:

V>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.

V>
V>void dummy(type var, type var2)
V>{
V>  STATIC_ASSERT_NO_POINTER_VALUE(var); /* all or nothing */

V>  type res = var-var2; /* valid if not pointer arithmetic */

V>  /* ... */
V>}


Вообще если type не производится от указателя, то при попытке передать указатель будет warning. Интрепретировать предупреждения как ошибки — хорошая практика.
Или имеется ввиду, что вместо type может быть любой тип, например void dummy(int var, int var2) компилироваться должно, а void dummy(int *var, int *var2) — не должно?

V>
#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...
V>

V>Во что надо задефайнить макрос?

Для интегральных типов могу предложить что-то типа
#define STATIC_ASSERT_NO_POINTER_VALUE(var) (((void *)0)[var] == ((void *)0)[var])

Eсли var — указатель, ошибка компиляции обеспечена. Но не вижу гарантии, что любой компилятор выбросит разименование указателя.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.