Сбой компиляции, если возвращаемое значение не используется для определенного типа

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

Примечание: наша среда выполнения (встроенная) не позволяет нам использовать следующие конструкции: RTTI, исключения.

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

Мы предпочитаем решение, которое дает сбой во время компиляции, а не во время выполнения.

enum class Error {
INVAL,
NOERR,
};

// do something that can fail.
Error DoThing();
// may return different return codes, we never care (we can't change prototype)
int DoIgnoredThing();

int main() {
DoThing(); // compilation failure here, unused "Error" result
DoIgnoredThing(); // compilation succeeds, OK to ignore unused "int" result
return 0;
}

4

Решение

Я не знаю, как сделать это с прямым C ++, но если вы используете g ++, вы можете использовать атрибут warn_unused_result вместе с флагом командной строки -Werror = unused-result. Смотрите документацию по результату warn_unused, чтобы узнать, как его указать (к сожалению, вам придется указывать его в каждой функции; я не думаю, что вы можете указать его для типа). Тогда флаг компилятора превратит это предупреждение в ошибку.

Если вы не используете g ++, ваш компилятор может иметь аналогичную функциональность.

3

Другие решения

Возможно, вам будет проще использовать инструмент анализа кода для сканирования исходного кода.

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

Вы можете запустить инструмент анализа как часть процесса компиляции или как часть сервера сборки.

0

Я попробовал несколько способов создать класс, который бы делал то, что вы хотите, но у меня ничего не получилось. Рассматривали ли вы сделать ваше «возвращаемое значение» аргумент, передаваемый по ссылке? Это самый распространенный способ, которым я видел API-интерфейсы, заставляющие вас обращать внимание на возвращаемое значение. Так что вместо

Error DoThing();

у тебя есть

void DoThing(Error& e);

Все, что вызывает DoThing (), должно передать объект Error, иначе они получат ошибку компилятора. Опять же, не совсем то, что вы просили, но, может быть, достаточно хорошо?

0
По вопросам рекламы [email protected]