Как заставить VS2015 правильно отклонить использование префикса класса в объявлении класса?
Я недавно скопировал и вставил функцию-член C++ из моего cpp-файла в заголовок и забыл удалить префикс. Итак, в файле cpp у меня было что-то вроде:
int MyClass::Return42() const { return 42; }
и в моем заголовке:
class MyClass {
public:
int MyClass::Return42() const;
};
Теперь я уверен, что я сделал это раньше и заставил компилятор горько жаловаться на то, что это не разрешено, требуя удаления префикса класса в заголовке. по факту g++ 5.4.0
жалуется на это под Linux независимо от того, на какой стандарт ISO я нацеливаюсь (с 11 по 17), используя один файл (хотя -fpermissive
превратит это в предупреждение, а не в ошибку):
#include <iostream>
class MyClass {
public:
int MyClass::Return42() const;
};
int MyClass::Return42() const { return 42; }
int main() {
MyClass x;
std::cout << x.Return42() << '\n';
}
Но я обнаружил, что моя новая установка VsPro15 позволяет это сделать.
Как заставить Visual Studio отклонить этот неверный код, если бы я хотел, чтобы мой код был переносимым на разные платформы?
Я знаю о предлагаемых решениях, связанных с /permissive-
а также /Ze
,
Во-первых, даже с VS2k15 Update 3, введя /permissive-
в Project properties | C/C++ | Command Line | Aditional Options
поле, приводит к:
2> cl: предупреждение командной строки D9002: игнорирование неизвестной опции '/permissive-'
Во-вторых, я вижу:
2> cl: предупреждение командной строки D9035: опция 'Ze' устарела и будет удалена в следующем выпуске
но он все равно компилирует ошибочный код.
Так что я не верю, что это жизнеспособное решение.
3 ответа
Насколько я знаю, вы не сможете не заставить VS2015 предупредить об этом. В этом документе говорится, что вам нужно /permissive-
Переключитесь, чтобы получить это конкретное предупреждение. В нем также говорится, что он должен быть включен в VS2015. Может быть, это ошибка компилятора?
В VS2017, однако, вы можете использовать /permissive-
переключение, чтобы компилятор более соответствовал стандарту (это также намек, что он не соответствует стандарту, но я не могу найти правильное место в стандарте - может быть, кто-то может его заполнить), см. здесь. С этим вы получаете следующее предупреждение:
error C4596: 'Return42': illegal qualified name in member declaration
Предупреждение, которое вы хотите, также может быть вызвано с помощью /we4596
включить только это предупреждение вместо того, чтобы исходить от более стандартного компилятора соответствия.
Когда я правильно понимаю документацию, в VS2015 вы можете использовать /Ze
переключатель (в отличие от /permissive-
), однако, когда я использовал компилятор-проводник правильно, это все равно не предупреждает, см. здесь. /Ze
Переключатель также обсуждается в этом вопросе SO.
РЕДАКТИРОВАТЬ:
Я нашел это там, где говорится, что предупреждение C4596 введено в версии компилятора 19.00.24215.1. Проводник компилятора в настоящее время содержит более старый компилятор (например, 19.00.24210), поэтому это может быть причиной его неработоспособности.
Ищите C4596 в следующей статье:
https://blogs.msdn.microsoft.com/vcblog/2016/11/16/permissive-switch/
//Use of qualified names in member declarations
struct A {
void A::f() { } // error C4596: illegal qualified name in member declaration
// remove redundant 'A::' to fix
};
Документация уровня предупреждения
/ we nnnn: обрабатывает предупреждение компилятора, указанное в nnnn, как ошибку.
Так что согласно комментарию @ пи выше, для предупреждения C4596
, добавив параметр /we4596
делает трюк тогда.
<source>(5): error C4596: 'Return42': illegal qualified name in member declaration
Compiler returned: 2
При добавлении /w14596
только выдает предупреждение, если вы предпочитаете.
<source>(5): warning C4596: 'Return42': illegal qualified name in member declaration
Compiler returned: 0
Как комментарии @pi ниже, это только для VS2017++.