Я студент, и я пытаюсь написать и запустить некоторый тестовый код для задания, чтобы проверить его, прежде чем включать его. То, что я пытаюсь сделать сейчас, это проверить, что мой код предотвращает правильность семантики. В моем задании я объявил для каждого из моих классов свой собственный частный конструктор копирования и оператор присваивания, которые не имеют определения, и поэтому ничего не делают. Когда они вызываются в моей тестовой программе, я получаю ошибки компиляции, как я ожидал. Что-то вроде этого:C++ тестирование ошибок компиляции
error: 'myClass::myClass(const &myClass)' is private'
error: 'myClass& myClass::operator=(const myClass&)' is private
Есть ли способ использовать TRY/поймать, так что мой тестовый код будет скомпилировать и запустить, но показать мне, что эти ошибки имели место? Я пробовал:
myClass obj1(...);
myClass obj2(...);
try{
obj1 = obj2;
throw 1;
}
catch(int e){
assert(e==1);
}
но компилятор по-прежнему дает мне выше ошибки. Разве это не «исключения»? Неужели они не вызовут броска?
Если я правильно понимаю/правильно разбираюсь, он обрабатывает ошибки времени выполнения, а не ошибки, которые я получал выше, правильно?
После проведения еще нескольких исследований кажется, что нет (простого) способа тестирования определенных ошибок компиляции изнутри C++ (это, возможно, верно для большинства языков, теперь я думаю об этом). Я прочитал post, который предлагает написать некоторый тестовый код на языке сценариев, который пытается скомпилировать фрагменты кода на C++ и проверяет наличие ошибок, а другой - post, который рекомендует использовать Boost.Build.
Что является самым простым/лучшим способом сделать то, что я пытаюсь сделать?
Я просмотрел документацию для Boost.Build, и это немного над моей головой. Если бы я использовал его, как бы проверить, что файл, скажем, «test.cpp» компилируется и, возможно, обрабатывать определенные ошибки компиляции, которые встречаются с «test.cpp»?
Благодарим за помощь!
P.S. Это одна из моих первых должностей, надеюсь, я сделал «достаточно» исследований и сделал все остальное должным образом. Извините, если я этого не сделал.
Как только вы компилируете программу, вы получите список ошибок. Этого было недостаточно ?! Если вы добавите тестовый класс, который не сможет извлечь больше «компиляции ошибок» из вашего кода. Тестовые классы записываются в (после компиляции), запускают ваш код и извлекают семантические ошибки. – Shahbaz
В этом случае, когда у меня было только несколько операций, которые я хотел протестировать, чтение ошибок компиляции не было действительно большим делом. Но что происходит, когда вы работаете над большим проектом, и есть много операций/действий, которые вы хотите предотвратить, операции/поведение, которые вы хотите произвести с ошибками компиляции? Ручное чтение и проверка на каждый из них кажется более чем утомительным. –
Подождите, вы не можете «произвести ошибку компиляции» для работы/поведения во время выполнения. Компилятор читает ваш код, следит за тем, чтобы он соответствовал языку C++, лексически, грамматически и семантически, и генерировал для него код. Он проверяет только то, что указано языком C++. Если сгенерированный код не работает, это не имеет ничего общего с компилятором (поэтому он не может дать вам ошибки компиляции) – Shahbaz