Убедитесь, что мы инициализируем каждую переменную один раз и только один раз - PullRequest
0 голосов
/ 23 февраля 2019

Ниже приведен тест из библиотеки обработки исключений LLVM libcxxabi (которая, кстати, использует библиотеку LLVM для размотки стека libunwind):

// libcxxabi\test\test_guard.pass.cpp
...
// Ensure that we initialize each variable once and only once.
namespace test1 {
    static int run_count = 0;
    int increment() {
        ++run_count;
        return 0;
    }
    void helper() {
        static int a = increment();
        ((void)a);
    }
    void test() {
        static int a = increment(); ((void)a);
        assert(run_count == 1);
        static int b = increment(); ((void)b);
        assert(run_count == 2);
        helper();
        assert(run_count == 3);
        helper();
        assert(run_count == 3);
    }
}

...

int main()
{
    test1::test();
}

Возможно, я упускаю что-то очевидное, но я не уверен, чтоИдея этого теста (что он тестирует и как).У вас есть идеи?

Почему эти три переменные

static int run_count
static int a (in test(), not in helper())
static int b 

объявлены статическими?

1 Ответ

0 голосов
/ 23 февраля 2019

Это тест, чтобы убедиться, что компилятор работает правильно.Он должен передавать любой подтверждающий компилятор c ++.

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

Переменные объявляются статическими, чтобы гарантировать, что различные формы статических переменных инициализируются правильно и что инициализаторы вызываются только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...