Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995

как работает if constexpr?

13.03.2020, 12:37. Показов 3148. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим я не хочу писать писать вариадик макрос, но при этом отключить генерацию кода(а в идеале и вызова самой функции, см. далее). Подойдет ли для этого if constexpr?
например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// config.hpp
#ifndef NDEBUG
#   include <iostream>
    inline constexpr int log_lvl = 1;
#else
    inline constexpr int log_lvl = 0;
#endif
 
// some.hpp
template<class...Args> [[maybe_unused]] void log_dbg([[maybe_unused]] Args&&...args)
{
    if constexpr (log_lvl == 1)
    {   // будет ли компилятор генерировать этот код, если задефайнить NDEBUG?
        ((std::cout << std::forward<Args>(args)), ...) << std::endl;
    }
    // и можно ли как то с помощью атрибута подавить ворнинги, у меня не выходит?
    // ну и может ли компилятор вообще "вырезать" вызов этой функции если определён макрос NDEBUG?
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2020, 12:37
Ответы с готовыми решениями:

Присваивание constexpr к non-constexpr
constexpr float pi = 3.14159265; void some_fun() { float angle = 45.0f*(pi/180.0f); std::cout &lt;&lt; angle; } В консоли...

Ключевое слово constexpr: как определить удалось ли вычислить возвращаемое значение на этапе компиляции?
https://habrahabr.ru/post/228181/ Как определить удалось ли вычислить возвращаемое значение на этапе компиляции? Я понимаю что...

Как компилятор обрабатывает член класса static constexpr const char*
Привет! Наткнулся на непонятный момент class Foo { public: static constexpr const char* PTR = &quot;value&quot;; }; ...

13
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 12:54
zayats80888, я бы сказал, что ни один современный компилятор не будет генерировать код, даже с обычным if, если условие всегда false.
2
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.03.2020, 13:09  [ТС]
DrOffset, спс. А по поводу ворнингов:
C++
1
2
3
4
5
//...
else
{
    (((void)args), ...); // если так то не ругается, а атрибутом можно?
}
И сам вызов функции, если она ничего не делает, может быть проигнорирован компилятором, я правильно понимаю?

Добавлено через 3 минуты

Не по теме:

З.Ы. ругается VS17

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 13:11
Лучший ответ Сообщение было отмечено zayats80888 как решение

Решение

Цитата Сообщение от zayats80888 Посмотреть сообщение
И сам вызов функции, если она ничего не делает, может быть проигнорирован компилятором, я правильно понимаю?
Я бы сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// some.hpp
 
#ifndef NDEBUG
#   include <iostream>
 
template<class...Args> void log_dbg(Args&&...args)
{
    ((std::cout << std::forward<Args>(args)), ...) << std::endl;
}
#else
template<class...Args> static inline void log_dbg(Args&&...)
{ }
#endif
Тогда и вызова не будет и warning`а.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.03.2020, 13:26  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
template<class...Args> static inline void log_dbg(Args&&...)
последний вопрос, какую роль тут играет static inline?
static говорит что инстанцироваться будет свой экземпляр в каждой единице трансляции?
а inline зачем, шаблоны вроде и так inline (всмысле external link, что то я запутался )?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 13:35
Цитата Сообщение от zayats80888 Посмотреть сообщение
static говорит что инстанцироваться будет свой экземпляр в каждой единице трансляции?
Чтобы не было соблазна сделать предположение, что функция находится в другой единице трансляции, т.к. это сделает невозможным исключение вызова.

Цитата Сообщение от zayats80888 Посмотреть сообщение
а inline зачем, шаблоны вроде и так inline
Шаблоны не inline. Но inline в принципе не нужен здесь, это да.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.03.2020, 13:37
Тут на форуме выкладывали интересное видео с лекцией по С++.
Уже не помню, кто выкладывал... Может, Вы, DrOffset?
Думаю, будет полезно многим...

Кликните здесь для просмотра всего текста
0
13.03.2020, 13:39  [ТС]

Не по теме:

Цитата Сообщение от liv Посмотреть сообщение
Тут на форуме выкладывали интересное видео с лекцией по С++
я его смотрел, но вот про шаблон inline static функции там не рассказывали :)

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 13:46

Не по теме:

Цитата Сообщение от liv Посмотреть сообщение
Может, Вы, DrOffset?
Я :)



Добавлено через 2 минуты
zayats80888, inline вообще нужен для старых компиляторов в данном случае, в качестве подсказки.
Но т.к. у нас современный компилятор априори (по случаю использования С++11 и выше), то это не нужно.
1
13.03.2020, 13:48

Не по теме:

Ну и славно )) Будет не лишним напомнить себе и другим обо всех этих премудростях ))

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 13:56
Лучший ответ Сообщение было отмечено zayats80888 как решение

Решение

zayats80888, и все-таки inline нужен, если хочется отсутствия вызова и при нулевой оптимизации. Только даже не inline, а его более сильный вариант по типу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef _MSC_VER
#   define always_inline __forceinline
#elif defined(__GNUC__)
#   define always_inline __attribute__((always_inline)) inline
#else
#   define always_inline inline
#endif
 
// some.hpp
 
#ifndef NDEBUG
#   include <iostream>
 
template<class...Args> void log_dbg(Args&&...args)
{
    ((std::cout << std::forward<Args>(args)), ...) << std::endl;
}
#else
template<class...Args> static always_inline void log_dbg(Args&&...)
{ }
#endif
Иначе вызов останется с O0.
3
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.03.2020, 15:12
Цитата Сообщение от zayats80888 Посмотреть сообщение
Допустим я не хочу писать писать вариадик макрос, но при этом отключить генерацию кода(а в идеале и вызова самой функции, см. далее). Подойдет ли для этого if constexpr?
Нет, аргументы log_dbg всё равно будут вычисляться.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 15:41
zayats80888, кстати, да. С вычислением аргументов может быть проблема, если там в аргументах не банальная передача ссылки, а что-то более сложное, особенно обладающее побочными эффектами. Поэтому далеко не во всех случаях получится полностью убрать следы из кода.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.03.2020, 15:57  [ТС]
Ладно, я понял, остановлюсь на макросе . Всем спасибо, было познавательно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2020, 15:57
Помогаю со студенческими работами здесь

Constexpr
В программе внутри конструкции switch case, встретился с шибкой the value of 'str' is not usable in a constant expression

Constexpr функции
В продолжении моего вопроса в этой теме - https://www.cyberforum.ru/cpp-beginners/thread1913846.html Хотел бы уточнить. У нас есть вот...

Constexpr конструктор
Добрый день, что означает constexpt конструктор? class Foo { public: constexpr Foo() noexcept = default; }; int main() ...

Использование constexpr vs const
Добрый вечер, есть 2 кода: Первый: constexpr float FIXED_FPS = 45.0f; constexpr float FIXED_DT = 1.0f / FIXED_FPS; Второй: ...

Std::log2 и constexpr
Я бы хотел прояснить пару моментов по std::log2. 1) Это constexpr функция? Выставил gcc ключ pedantic, вбил int test;, вроде работает, на...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru