Как я могу убедиться, что какой-то определенный код не выдается?
Скажем, я пытался написать что-то вроде static switch
(или же static if
) и я хочу определить, есть ли вторая лямбда operator ()
Тело испускается:
#include <type_traits>
namespace details
{
template< typename visitor, typename ...visitors >
struct composite_visitor
: std::decay_t< visitor >
, composite_visitor< visitors... >
{
using std::decay_t< visitor >::operator ();
using composite_visitor< visitors... >::operator ();
composite_visitor(visitor & _visitor, visitors &... _visitors)
: std::decay_t< visitor >(std::forward< visitor >(_visitor))
, composite_visitor< visitors... >{_visitors...}
{ ; }
};
template< typename visitor >
struct composite_visitor< visitor >
: std::decay_t< visitor >
{
using std::decay_t< visitor >::operator ();
composite_visitor(visitor & _visitor)
: std::decay_t< visitor >(std::forward< visitor >(_visitor))
{ ; }
};
}
template< typename visitor, typename ...visitors >
details::composite_visitor< visitor, visitors... >
compose_visitors(visitor && _visitor, visitors &&... _visitors)
{
return {_visitor, _visitors...};
}
#include <iostream>
#include <cstdlib>
template< int condition >
void
test()
{
compose_visitors(
[] (std::integral_constant< int, 0 >) { std::cout << 0 << std::endl; },
[&] (std::integral_constant< int, 1 >) { std::cout << 1 << std::endl; },
[] (std::integral_constant< int, 2 >) { std::cout << 2 << std::endl; }
)(std::integral_constant< int, condition >{});
}
int
main()
{
test< 0 >();
//test< 1 >();
test< 2 >();
return EXIT_SUCCESS;
}
Какие приемы позволяют мне обнаружить наличие определенного блока кода в полученном двоичном файле / .o / .a?
Ранее можно было сделать следующее (для НКУ):
-Wa,-adhlns="[email protected]"
в CXXFLAGS
;asm volatile ("nop");
оператор для блока кода, который вы хотите проверить;awk "/\#APP/, /\#NO_APP/" build/*.lst
(вместо символа хеша может быть косая черта), чтобы увидеть встроенную сборку в *.lst
файлы в build
каталог;awk
печатает что-то, затем генерируется определенный блок кода.Но я пользуюсь clang
и поэтому не может использовать -Wa
параметр компилятора. Какой путь для clang
? Я знаю, что я могу излучать файлы сборки (.S
) с помощью -S
опция компилятора, но в большом проекте это трудно сделать, если во время сборки существует цепочка зависимостей. Как излучать сборки к тому же в .o
файлы?
Задача ещё не решена.
Других решений пока нет …