Контакт с C++, “инициализированным, но не” предупреждение, на которое ссылаются, для разрушения помощников объема?

Ваша задача больше связана с процессором, чем с операциями ввода-вывода. Асинхронное выполнение имеет смысл, когда у вас длинные операции ввода-вывода, т.е. отправка / получение чего-либо из сети и т. Д.

То, что вы можете сделать, это разделить задачу на куски и использовать потоки и многопроцессорность (работать на разных ядрах процессора).

14
задан Andrew Grant 21 October 2008 в 01:00
поделиться

12 ответов

Метод 1: Использование #pragma warning директива.

#pragma warning позволяет выборочную модификацию поведения сообщений предупреждения компилятора.

#pragma warning( push )
#pragma warning( disable : 4705 ) // replace 4705 with warning number

ScopeGuard close_guard = MakeGuard( &close_file, file );

#pragma warning( pop )

Этот код сохраняет текущее состояние предупреждения, затем это отключает предупреждение для определенного кода предупреждения и затем восстанавливает последнее сохраненное состояние предупреждения.

Метод 2: Использование обходное решение как следующее. Visual Studio будет счастлива и вы тоже. Это обходное решение используется во многих образцах Microsoft и также в других проектах.

ScopeGuard close_guard = MakeGuard( &close_file, file );
close_guard;

Или можно создать #define к обходному решению предупреждение.

#define UNUSED_VAR(VAR) VAR
...
ScopeGuard close_guard = MakeGuard( &close_file, file );
UNUSED_VAR(close_guard);
<час>

Некоторые пользователи заявили, что представленный код не будет работать, потому что ScopeGuard является определением типа. Это предположение является неправильным.

http://www.ddj.com/cpp/184403758

Согласно Стандарту C++, ссылка, инициализированная с временной ценностью, делает ту временную ценность живой в течение времени жизни самой ссылки.

5
ответ дан 1 December 2019 в 12:14
поделиться

Можно определить объем предупреждения #pragma вокруг той строки кода только при помощи

#pragma warning(push)
#pragma warning(disable:XXXX)
your code here;
#pragma warning(pop)

, или

#pragma warning(disable:XXXX)
your code here;
#pragma warning(default:XXXX)

можно также использовать UNREFERENCED_PARAMETER(close_guard); после строки кода выше.

1
ответ дан 1 December 2019 в 12:14
поделиться

Я предполагаю на практике, я был бы, grudingly пойти с #pragma отключают... или 'НЕИСПОЛЬЗОВАННЫЙ'. Однако как основное правило, код должен содержаться в чистоте предупреждений даже за счет некоторого дополнительного объема. Это должно скомпилировать в нескольких различных компиляторах на различных платформах и операционных системах без предупреждений. Если это не делает, код имеет, к фиксированному так, чтобы это сделало. Поддержание кода, который генерирует предупреждения в gcc - Стенной уровень, не является хорошей идеей.

Предупреждения компилятора являются Вашим другом и должны быть учтены как вопрос или принцип. Даже когда это означает, что вещи должны быть реализованы в немного более большом и большем количестве подробных путей. Платежи за себя в конечном счете как код портируются, сохраняются и живут на навсегда...

1
ответ дан 1 December 2019 в 12:14
поделиться

Я использую сообщение smink выше и имею только, чтобы добавить, что я придерживаюсь, комментарий рядом с высказыванием #define//раньше подавлял предупреждение [предупреждение числа] в visual studio

0
ответ дан 1 December 2019 в 12:14
поделиться

Попытайтесь добавить 'энергозависимый' к объявлению ScopeGuard.

0
ответ дан 1 December 2019 в 12:14
поделиться

Вы могли явно создать объект ScopeGuardImpl1, при условии, что нет такого количества параметров в случаях, Вы используете это, результат нечитабелен. Тем путем Вы избежали бы reference-initialized-with-temporary, который VS, предупреждающему, по-видимому, не удается понять. Стоимость должна записать вещи обычное письмо, вместо того, чтобы получить волшебство шаблона MakeGuard.

0
ответ дан 1 December 2019 в 12:14
поделиться

Базовая проблема здесь, кажется, действительно, что компилятор действительно не совсем понимает то, в чем Вы идете..., который, кажется, для использования семантики обзора в C++ для получения некоторого кода, названного, когда переменная освобождена, даже когда это не используется.Правильно? Тот механизм сам кажется мне границей... компилятор должен иметь право удалить неиспользуемые переменные, но семантика конструкции C++ действительно портит эти вещи. Никакой другой способ сделать это, которое является меньшим количеством ловкости рук?

-3
ответ дан 1 December 2019 в 12:14
поделиться

Если Ваш объект имеет нетривиальный деструктор, Visual Studio должна не , дают Вам то предупреждение. Следующий код не генерирует предупреждений в VS2005 с предупреждениями, превращенными полностью (/W4):


class Test
{
public:
    ~Test(void) { printf("destructor\n"); }
};

Test foo(void) { return Test(); }

int main(void)
{
    Test t = foo();
    printf("moo\n");

    return 0;
}

Комментирование деструктора дает предупреждение; код как есть не делает.

9
ответ дан 1 December 2019 в 12:14
поделиться

Я использовал бы макрос полностью в этом случае:

#define SCOPE_GUARD(guard, fn, param) \
    ScopeGuard guard = MakeGuard(fn, param); \
    static_cast<void>(guard)

теперь Ваш код хорош и короток:

SCOPE_GUARD(g1, &file_close, file1);
SCOPE_GUARD(g2, &file_close, file2);

Одно преимущество этого подхода состоит в том, что позже можно добавить __LINE__, __func__ и т.д. для входа защитных действий позже в случае необходимости.

3
ответ дан 1 December 2019 в 12:14
поделиться

Мы используем:

static_cast<void>(close_guard);

для переменных, на которые жалуется компилятор.

3
ответ дан 1 December 2019 в 12:14
поделиться

В части VC ++ заголовочные файлы, MS определяет макрос:

#define UNUSED(x) x

используемый как:

ScopeGuard close_guard = MakeGuard( &close_file, file );
UNUSED(close_guard);

, Который заставляет предупреждение замолчать и документирует его.

3
ответ дан 1 December 2019 в 12:14
поделиться

ну, в этом случае ScopeGuard является на самом деле определением типа к ссылочному типу. Это не работало бы, к сожалению.

Разве, который не означал бы, целый ScopeGuard не работает, потому что в этом случае деструктор не назовут???

2
ответ дан 1 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: