Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
AGluk
 Аватар для AGluk
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
05.08.2011, 15:18     Выбор кода для компиляции на основании сравнения параметров шаблона #1
Здравствуйте.
Помогите, пожалуйста, разобраться со следующим вопросом. Необходимо выбирать компилируемый код в зависимости от какого-либо условия. Для примера рассмотрим следующую функцию:

Код
template <int p> int MyFunc()
{
    #if (p < 0)
        return -1;
    #elif (p > 0)
        return 1;
    #else
        return 0;
    #endif
}
С какими бы параметрами шаблона я не вызывал данную функцию я всегда попадаю в ветку #else.
Поиск в интернете не привел к положительным результатам. Возможно я чего-то недопонимаю в работе препроцессора или ошибаюсь в какой-нибудь ерунде.
Большое спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 15:18     Выбор кода для компиляции на основании сравнения параметров шаблона
Посмотрите здесь:

C++ Ошибка при компиляции кода
Оформление выполненного кода в виде шаблона функции C++
Перехват значений параметров шаблона C++
C++ Выбор кода при компиляции
C++ Компилятор путает знаки шаблона и оператор сравнения
Переменное число параметров шаблона C++
C++ Явная специализация шаблона функции - ошибка на этапе компиляции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
05.08.2011, 15:22     Выбор кода для компиляции на основании сравнения параметров шаблона #2
боюсь тебя огорчить, но макросы все раскрываются до инстанцирования и вобще до того как кампилятор просматривает шаблон. Это ж препроцессорные директивы
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
05.08.2011, 15:27     Выбор кода для компиляции на основании сравнения параметров шаблона #3
Цитата Сообщение от AGluk Посмотреть сообщение
Возможно я чего-то недопонимаю в работе препроцессора
Возможно. Препроцессор обрабатывает программу до компилятора. И, соответственно, до инстанцирования шаблона. Да и вообще, для препроцессора не существует переменных (даже константных), поэтому он рассматривает p как необъявленный идентификатор (поскольку ранее не было директивы #define p)

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

Добавлено через 1 минуту
AGluk, используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
из кода точно не исключит, в отличии от припрацессорного=)
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
05.08.2011, 15:41     Выбор кода для компиляции на основании сравнения параметров шаблона #5
Цитата Сообщение от silentnuke Посмотреть сообщение
из кода точно не исключит, в отличии от припрацессорного=)
Исключит, если хотя бы какая-то оптимизация включена. При отключённой оптимизации не уверен.

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

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

Выбор значения для шаблона, bool отделить от std::is_integral C++
C++ Выбор версии компилятора для онлайн проверки кода
Ошибка компиляции при реализации класса-шаблона C++
Ошибка при компиляции кода C++
C++ Макрос с переменным числом параметров для сокращения кода

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
05.08.2011, 16:11     Выбор кода для компиляции на основании сравнения параметров шаблона #11
Сыроежка, а всё обсуждение почитать? Или хотя бы #3
Yandex
Объявления
05.08.2011, 16:11     Выбор кода для компиляции на основании сравнения параметров шаблона
Ответ Создать тему
Опции темы

Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru