#c #unit-testing #c 11 #pointers #variables
Вопрос:
Мне нужно протестировать некоторый код, и методы принимают указатели на объекты. Поскольку я хочу написать много тестов, упрощенные мои тесты выглядят так
bool addPoint(Point* point);
EXPECT_TRUE(addPoint(amp;Point(0, 0, 0)));
EXPECT_TRUE(addPoint(amp;Point(-10, 0, 0)));
EXPECT_TRUE(addPoint(amp;Point(0, -10, 0)));
//and so on
Это прекрасно работает. Я знаю, что брать адрес временной переменной-не очень хороший стиль, но в противном случае мне придется вводить гораздо больше, создавая правильные точечные объекты и передавая их в тест.
Насколько я знаю, временный адрес не является UB, поэтому я могу полагаться на то, что мои тесты всегда будут работать так, как они работают сейчас? Или есть какие-то другие недостатки в использовании временного адреса?
Комментарии:
1.
amp;Point(0, 0, 0)
не следует компилировать, еслиPoint
только он не перегруженoperator amp;
. timsong-cpp.github.io/cppwp/expr.unary.op#32. » Я знаю, что использование адреса временной переменной не является хорошим стилем » — это не просто плохой стиль, это технически незаконно, код даже не должен компилироваться в нормальных условиях. Вероятно, вы используете компилятор, который позволяет использовать его в качестве нестандартного расширения. В этом случае я бы просто ввел вспомогательную перегрузку, например:
bool addPoint(Point point) { return addPoint(amp;point); }
илиbool addPoint(const Point amp;point) { return addPoint(const_cast<Point*>(amp;point)); }
илиbool addPoint(int x, int y, int z) { Point point(x, y, z); return addPoint(amp;point); }
…3. … А затем вы можете отказаться
amp;
от своихaddPoint()
звонков, например:EXPECT_TRUE(addPoint(Point(0, 0, 0))); EXPECT_TRUE(addPoint(Point(-10, 0, 0))); EXPECT_TRUE(addPoint(Point(0, -10, 0))); //and so on
илиEXPECT_TRUE(addPoint({0, 0, 0})); EXPECT_TRUE(addPoint({-10, 0, 0})); EXPECT_TRUE(addPoint({0, -10, 0})); //and so on
илиEXPECT_TRUE(addPoint(0, 0, 0)); EXPECT_TRUE(addPoint(-10, 0, 0)); EXPECT_TRUE(addPoint(0, -10, 0)); //and so on
4. Эта проблема может быть устранена путем передачи параметров по ссылке или постоянной ссылки, если параметр не изменен.
5. Он не работает в MSVC при компиляции с
/Za
(отключите языковые расширения). В любом случае, использование временного адреса недопустимо в C , и его лучше избегать, даже если ваш компилятор примет его как нестандартное расширение.