Использование макросов тестирования функций с G CC -7 - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь использовать макрос тестирования функции с G CC 7.3. В частности, я проверяю гарантированное разрешение копирования с помощью макроса __cpp_guaranteed_copy_elision.

Я использую G CC 7.3 с флагом -std=c++17. Здесь я на самом деле пишу код , который определенно требует гарантированного разрешения копирования (я возвращаю std::atomic<int> по значению). Код работает и компилируется нормально. Тем не менее, мой макро-тест проверки возможностей всегда не выполняется для __cpp_guaranteed_copy_elision. Вот код:

#include <iostream>
#include <atomic>

std::atomic<int> F() { return std::atomic<int>{}; }

int main()
{
#if __cpp_guaranteed_copy_elision
        std::cout << "Have guaranteed copy elision" << std::endl;
#else
        std::cout << "Don't have it" << std::endl;
#endif

        std::atomic<int> a = F();
}

Я компилирую это с:

g++ test.cpp -o test -std=c++17

И он всегда выводит:

Don't have it

Я также пытался:

#if defined(__cpp_guaranteed_copy_elision)

И все равно сообщается отрицательно. Так G CC 7.3 просто не поддерживает этот макрос? Или я неправильно использую макросы тестирования функции?

1 Ответ

2 голосов
/ 12 марта 2020

Так G CC 7.3 просто не поддерживает этот макрос?

Это не так. g cc не добавлял этот конкретный макрос тестирования функций до 8.3 и 9.1 Это несмотря на то, что, похоже, поддерживается гарантированное копирование с версии 7.1, что вызывает сожаление. Не так много вы можете сделать с этим сейчас.

Или я неправильно использую макросы тестирования функций?

Проверка правильности определения только __cpp_guaranteed_copy_elision правильна, да (#ifdef x или #if defined(x) в порядке) .

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

...