Здравствуйте, 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 — указатель, ошибка компиляции обеспечена. Но не вижу гарантии, что любой компилятор выбросит разименование указателя.