Отладка во время компиляции в C++

В соответствии с принципом constexpr everything и введением consteval в C++20 все больше и больше кода оценивается во время компиляции.

Это приводит к очевидному вопросу: как мы это отлаживаем?

Единственными подсказками в настоящее время являются ошибки компилятора. Но что, если код компилируется, но все равно не делает того, что ожидается. Есть ли инструменты, которые могут помочь в этом? Есть возможность осмотра?

Связанный с этим вопрос: как узнать, какие из них действительно будут «выполняться» во время компиляции, а какие остаются во время выполнения, несмотря на квалификатор.


person non-user38741    schedule 16.08.2020    source источник
comment
constexpr функции можно вызывать в контексте, отличном от constexpr, чтобы вы могли отлаживать их как обычные функции.   -  person Jarod42    schedule 16.08.2020
comment
@Jarod42: Это не относится к тегу consteval. Вы также не можете легко настроить свои функции constexpr для отладки; в то время как вы можете использовать std::is_constant_evaluated, это не поможет воспроизвести любое использование в константных выражениях.   -  person Davis Herring    schedule 16.08.2020
comment
Наткнулся на это выступление Херба Саттера 2017 года: youtu.be/4AfRAVcThyA?t=1807 Внизу справа. говорит: C++17 => требуется отладка во время компиляции. Через минуту он даже перечисляет наблюдение за временем компиляции. Что было сделано по этому поводу за три года, прошедшие с тех пор? ;-)   -  person non-user38741    schedule 16.09.2020


Ответы (1)


Я лично использую static_assert в качестве отладчика для функций constexpr, это не лучший инструмент, но он может заменить такой код, как if (irational_value) cout<<"bug";. Глупый пример для оценки во время компиляции, если 6-е число Фибоначи на самом деле равно 13

#include <vector>
#include <iostream>

int main(){
    constexpr unsigned sixth_fib=[](){
        unsigned prev=1;
        unsigned sum=1;
        for (unsigned i=0;i<5;i++)
        {
            auto tmp=sum;
            sum+=prev;
            prev=tmp;

        }
        return sum;
    }();
    static_assert(sixth_fib==13);
    std::cout<<sixth_fib<<std::endl;

}
person Spyros Mourelatos    schedule 16.09.2020
comment
В какой вселенной static_assert или cout<<"bug" называется отладка??? - person non-user38741; 26.09.2020
comment
Собственно в этом! отладка печати . Я не говорю, что это полный механизм отладки, но это не так. Кто-то должен использовать различные методы отладки для большой программы, чтобы использовать этот метод. Это самый быстрый метод, который вы можете использовать везде, но помните, что есть вероятность, что вы никогда не нужно делать трассировку стека или проверять утечку памяти в контексте constexpr, поэтому нет valgrind для constexpr. Но я действительно считаю, что было бы здорово иметь gdb в контексте constexpr - person Spyros Mourelatos; 30.09.2020