Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для AGluk
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4

Выбор кода для компиляции на основании сравнения параметров шаблона

05.08.2011, 15:18. Показов 1415. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Помогите, пожалуйста, разобраться со следующим вопросом. Необходимо выбирать компилируемый код в зависимости от какого-либо условия. Для примера рассмотрим следующую функцию:

Code
1
2
3
4
5
6
7
8
9
10
template <int p> int MyFunc()
{
    #if (p < 0)
        return -1;
    #elif (p > 0)
        return 1;
    #else
        return 0;
    #endif
}
С какими бы параметрами шаблона я не вызывал данную функцию я всегда попадаю в ветку #else.
Поиск в интернете не привел к положительным результатам. Возможно я чего-то недопонимаю в работе препроцессора или ошибаюсь в какой-нибудь ерунде.
Большое спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2011, 15:18
Ответы с готовыми решениями:

Выбор нужной ячейки, на основании двух параметров и отображение её имени
Привет, ребзя! Есть проблема. Ссылки на похожие можете не кидать, всё просмотрел, подобного не нашел. Есть ТРИ параметра в...

Ошибка при компиляции кода с процедурой, имеющей переменное число параметров
procedure P0(params a: array of byte) := exit; procedure P1(b: byte; params a: array of byte) := exit; begin P0(); P1(0); ...

Выбор кода при компиляции
Здравствуйте! Столкнулся с почти аналогичной проблемой, как и описанная в данной статье: ...

10
Заблокирован
05.08.2011, 15:22
боюсь тебя огорчить, но макросы все раскрываются до инстанцирования и вобще до того как кампилятор просматривает шаблон. Это ж препроцессорные директивы
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.08.2011, 15:27
Цитата Сообщение от AGluk Посмотреть сообщение
Возможно я чего-то недопонимаю в работе препроцессора
Возможно. Препроцессор обрабатывает программу до компилятора. И, соответственно, до инстанцирования шаблона. Да и вообще, для препроцессора не существует переменных (даже константных), поэтому он рассматривает p как необъявленный идентификатор (поскольку ранее не было директивы #define p)

Добавлено через 1 минуту
AGluk, используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
1
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно. Препроцессор обрабатывает программу до компилятора. И, соответственно, до инстанцирования шаблона. Да и вообще, для препроцессора не существует переменных (даже константных), поэтому он рассматривает p как необъявленный идентификатор (поскольку ранее не было директивы #define p)

Добавлено через 1 минуту
AGluk, используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
из кода точно не исключит, в отличии от припрацессорного=)
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.08.2011, 15:41
Цитата Сообщение от silentnuke Посмотреть сообщение
из кода точно не исключит, в отличии от припрацессорного=)
Исключит, если хотя бы какая-то оптимизация включена. При отключённой оптимизации не уверен.

Добавлено через 6 минут
GCC даже с -O0 исключает.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.08.2011, 15:41
Цитата Сообщение от grizlik78 Посмотреть сообщение
Исключит, если хотя бы какая-то оптимизация включена
Исключит ПОСЛЕ компиляции. Если части кода не компилируемы, то не скомпилирует и не исключит.

Цитата Сообщение от AGluk Посмотреть сообщение
Помогите
Сделай глабальное определение макроса и условно компилируй код на основании его значения.
C++
1
2
3
4
5
6
7
8
9
#define P 1
void MyFunc()
{
#if p <0
...
#else
...
#endif
}
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.08.2011, 15:47
Цитата Сообщение от Deviaphan Посмотреть сообщение
Исключит ПОСЛЕ компиляции. Если части кода не компилируемы, то не скомпилирует и не исключит.
Разумеется. Кто бы спорил.
0
 Аватар для AGluk
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
05.08.2011, 16:01  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.08.2011, 16:04
Ну я проверил по ассемблерному коду на 2 компиляторах.
GCC 4.5 всегда убирал, VC2008 без оптимизации не убирает, а с /O2 или /O1 убирает.
Я бы ещё inline к такой функции добавил.
0
Заблокирован
05.08.2011, 16:09
Цитата Сообщение от AGluk Посмотреть сообщение
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
В вашем примере препроцессор рассматривает 'p' как препроцессорную константу. Так как она не объявлена явно, то ее значение равно нулю. Именно поэтому у вас всегда управление передается на ветку 'else'.
Препроцессор убирает код, который не удовлетворяет условию препроцессорной директивы #if-#else. Более того если, допустим, условие #if верное, то препроцессор даже не проверяет наличие ошибок в условие '#else', полностью ее игнорируя. И к оптимизации это никакого отношения не имеет. Это имеет отношение к работе препроцессора.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
05.08.2011, 16:11
Сыроежка, а всё обсуждение почитать? Или хотя бы #3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2011, 16:11
Помогаю со студенческими работами здесь

Применение оператора IF для сравнения с определёнными строками параметров пакетного файла
Подскажите пожалуйста как записать.... Если %1 равен пустому значению &quot;&quot; , то AVC=%1 и Если %2 равен значению &quot;lct&quot;, то ...

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. Ничего удивительного, учитывая то, ...

Заполнить данные на основании сравнения колонок
Подскажите пожалуйста! Есть 5 колонок: 2я колонка соответсвует 1й. 4я -&gt; 2й значения колонок 1 и 3 одинаковы но в разном...

Выбор текста для сравнения
Как из текстового файла или текст бокса выбрать кусок текста до точки, чтобы начать сравнение со вторым текстовым файлом?

Формирование отчетов на основании шаблона
Добрый день! Есть вопрос такого содержания: есть табличка с наимеваниями товара для отгрузки покупателю, необходимо на основании ее и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru