0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
1

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 6 минут
GCC даже с -O0 исключает.
0
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 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
}
0
Эксперт С++
2361 / 1649 / 275
Регистрация: 29.05.2011
Сообщений: 3,378
05.08.2011, 15:47 7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Исключит ПОСЛЕ компиляции. Если части кода не компилируемы, то не скомпилирует и не исключит.
Разумеется. Кто бы спорил.
0
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
05.08.2011, 16:01  [ТС] 8
Цитата Сообщение от grizlik78 Посмотреть сообщение
используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
0
Эксперт С++
2361 / 1649 / 275
Регистрация: 29.05.2011
Сообщений: 3,378
05.08.2011, 16:04 9
Ну я проверил по ассемблерному коду на 2 компиляторах.
GCC 4.5 всегда убирал, VC2008 без оптимизации не убирает, а с /O2 или /O1 убирает.
Я бы ещё inline к такой функции добавил.
0
Заблокирован
05.08.2011, 16:09 10
Цитата Сообщение от AGluk Посмотреть сообщение
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
В вашем примере препроцессор рассматривает 'p' как препроцессорную константу. Так как она не объявлена явно, то ее значение равно нулю. Именно поэтому у вас всегда управление передается на ветку 'else'.
Препроцессор убирает код, который не удовлетворяет условию препроцессорной директивы #if-#else. Более того если, допустим, условие #if верное, то препроцессор даже не проверяет наличие ошибок в условие '#else', полностью ее игнорируя. И к оптимизации это никакого отношения не имеет. Это имеет отношение к работе препроцессора.
0
Эксперт С++
2361 / 1649 / 275
Регистрация: 29.05.2011
Сообщений: 3,378
05.08.2011, 16:11 11
Сыроежка, а всё обсуждение почитать? Или хотя бы #3
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2011, 16:11

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.