Найперша і найдоступніша фіча, застосування якій можна знайти відразу - це static_assert. Призначення її очевидне - перевірка виразів на етапі компіляції. Раніше для цих цілей я використовував Boost.StaticAssert (і зараз використовую, бо переводити комерційні проекти на VS2010 ще рано, та і про кросплатформеність поки ще рано мріяти). Але на відміну від boost версії тут є можливість вказувати текст помилки.
При компіляції коду де присутня стрічка
static_assert(false, "It is false");
бачимо:------ Build started: Project: test1, Configuration: Debug Win32 ------При використанні boost
ClCompile:
test1.cpp
c:\documents and settings\alexandr\my documents\visual studio 10\projects\test1\test1\test1.cpp(18): error C2338: It is false
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
BOOST_STATIC_ASSERT(false);
отримуємо не такий зрозумілий вивід:------ Build started: Project: test1, Configuration: Debug Win32 ------
Compiling...
test1.cpp
c:\documents and settings\alexandr\my documents\Visual Studio 2005\projects\test1\test1\test1.cpp(18):(3455) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE'
with
[
x=false
]
test1 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Чекаємо з нетерпінням стандарту, а поки використовуємо boost реалізацію.
3 коментарі:
А спробуй-но колись на дозвіллі:
BOOST_STATIC_ASSERT(false && "This must never happen!");
Особисто я вважаю другий параметр зайвим.
Спробував у VS2005 і отримав ось таке:
------ Build started: Project: Test, Configuration: Release Win32 ------
Compiling...
Plugin.cpp
..\..\Sources\Plugin.cpp(3474) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'
with
[
x=false
]
Build log was saved at "file://d:\Develop\Test\Projects\VisualStudio\Release\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
А assert з поясненням необхідний для інших людей які потім використовують код і питають: "А что это такое?". Тому для мене static_assert був би найкращим вирішенням таких проблем. Але нажаль це тільки VS2010 beta :(
Мушу визнати, що я схибив, прошу пробачення. BOOST_STATIC_ASSERT відрізняється від BOOST_ASSERT чи просто assert. Для тих радять саме такий фокус.
Дописати коментар