Не знаю даже куда это больше подходит, сюда или в этюды..
Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.
void dummy(type var, type var2)
{
STATIC_ASSERT_NO_POINTER_VALUE(var); /* all or nothing */
type res = var-var2; /* valid if not pointer arithmetic */
/* ... */
}
#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...
Во что надо задефайнить макрос?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, 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>
Здравствуйте, ДимДимыч, Вы писали:
ДД>Или имеется ввиду, что вместо type может быть любой тип, например void dummy(int var, int var2) компилироваться должно, а void dummy(int *var, int *var2) — не должно?
Да
V>>
ДД>Eсли var — указатель, ошибка компиляции обеспечена.
Почти угадал, только здесь будет лишняя ошибка — void* нельзя разъименовывать.
ДД>Но не вижу гарантии, что любой компилятор выбросит разименование указателя.
Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Почти угадал, только здесь будет лишняя ошибка — void* нельзя разъименовывать.
Ок, меняем void* на int* или char*
V>Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит.
Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти.
Такая модификация должна решить пробоему:
ДД>Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти.
так обернуть его в if(0) { ... } что в рантайме его вообще не было
Здравствуйте, Vain, Вы писали:
V>Не знаю даже куда это больше подходит, сюда или в этюды.. V>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.
Я так тебя понял, что тебе надо проверить не то, что не указатель, а то, что тип -- число? То есть структуры тоже не канают, а вот плавучка -- вполне?
V>#define STATIC_ASSERT_NO_POINTER_VALUE(var) ... V>[/c] V>Во что надо задефайнить макрос?
надеюсь, что такое все оптимизируют в ничто и никто не ругается
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, ДимДимыч, Вы писали:
V>>Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит. ДД>Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти. ДД>Такая модификация должна решить пробоему: ДД>
Здравствуйте, Erop, Вы писали:
V>>Не знаю даже куда это больше подходит, сюда или в этюды.. V>>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным. E>Я так тебя понял, что тебе надо проверить не то, что не указатель, а то, что тип -- число? То есть структуры тоже не канают, а вот плавучка -- вполне?
float/double не обязателен был, но тоже можно убрать или добавить его к проверке.
V>>#define STATIC_ASSERT_NO_POINTER_VALUE(var) ... V>>[/c] V>>Во что надо задефайнить макрос? E>
Здравствуйте, Vain, Вы писали:
V>Тоже правильно, только зачем именно на 2 умножаешь?
1) Какая разница? Этот код компилятор выкинет.
2) А на что надо?
3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
E>>3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее... V>Поясни
int* p = 0;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>А при чём здесь умножение на 0?
Ну макрос же, мне вот, например, для того, чтобы понять, что во всех контекстах запись (var)*0 будет интерпретирована правильно, надо подумать, а для записи (var)*2 это очевидно. Ergo: запись с 2 ЧИТАБЕЛЬНЕЕ...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>>>А при чём здесь умножение на 0? E>>Ну макрос же V>Я не вижу связи, причём здесь какой-то макрос?
Плохо, что не видишь. Я же в следующих словах пояснял
Суть в том, что вместо var могут передать много чего. Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...
В первом приближении, макросы работают на уровне подстановок текста, поэтому нет никаких гарантий на аргумент...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>>>А при чём здесь умножение на 0? E>>>Ну макрос же V>>Я не вижу связи, причём здесь какой-то макрос? E>Плохо, что не видишь. Я же в следующих словах пояснял E>Суть в том, что вместо var могут передать много чего.
Не может, я же указал, что туда только имя переменной передаётся. E>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...
Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
E>>Суть в том, что вместо var могут передать много чего. V>Не может, я же указал, что туда только имя переменной передаётся.
А это как гарантируется? Или это типа этюд?
Ты, в принципе и про плавучку забыл указать, например.
E>>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора... V>Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти.
Тем, что 2 намного меньше перегружено.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>Суть в том, что вместо var могут передать много чего. V>>Не может, я же указал, что туда только имя переменной передаётся. E>А это как гарантируется?
Примерно также гарантируется как для других макросов. У тебя ведь не вызывает вопросов что, к примеру, в assert любой может передать любой мусор, непонятно почему здесь возникает.
E>>>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора... V>>Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти. E>Тем, что 2 намного меньше перегружено.
Ничего не понял, какая ещё перегрузка?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Примерно также гарантируется как для других макросов. У тебя ведь не вызывает вопросов что, к примеру, в assert любой может передать любой мусор, непонятно почему здесь возникает.
А ты попробуй передать в assert любой мусор и посмотри, что будет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>Ничего не понял, какая ещё перегрузка?
В С литерал 2 -- это точно целое. А 0 -- это тчо угодно, в зависимости от контекста.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>Ничего не понял, какая ещё перегрузка? E>В С литерал 2 -- это точно целое. А 0 -- это тчо угодно, в зависимости от контекста.
Пример этой зависимости можно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Пример этой зависимости можно?
Я уже приводил тебе пример.
То, что ты не хочешь понимать то, что тебе пишут, это твоя особенность такая. Суть-то не в том, чтобы самоутвердиться, а в том, что бы предложить хорошее решение, КОТОРОЕ МОГЛИ БЫ ИСПОЛЬЗОВАТЬ другие посетители КЫВТа...
Мне больше нравится решение с 2, на крайняк с 1, так как оно на мой взгляд читабельнее и надёжнее. Если тебе больше нравится 0, то ради бога, используй 0.
Главное не надо юзать ваши построения с указателями в квадратных скобках...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>Пример этой зависимости можно? E>Я уже приводил тебе пример.
Ты привёл свои догадки, но ничего конкретного.
E>То, что ты не хочешь понимать то, что тебе пишут, это твоя особенность такая. Суть-то не в том, чтобы самоутвердиться, а в том, что бы предложить хорошее решение, КОТОРОЕ МОГЛИ БЫ ИСПОЛЬЗОВАТЬ другие посетители КЫВТа...
Ну так обоснуй это решение, почему ноль нельзя использовать? Конкретного примера пока что я от тебя не услышал.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]