特定のコードが出力されていないことを確認するにはどうすればよいですか?
static switch
たとえば、 (or )のようなものを書き込もうとして、 2 番目のラムダの本体が放出されている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 に特定のコード ブロックの存在を検出できるようにするトリックは何ですか?
以前は次のことができました ( GCCの場合):
- に追加
-Wa,-adhlns="$@.lst"
しCXXFLAGS
ます。 - テストするコード ブロックにステートメントを追加
asm volatile ("nop");
します。 - ビルドしてから、ディレクトリ内のファイルへの
awk "/\#APP/, /\#NO_APP/" build/*.lst
インライン アセンブリを表示するコマンド (ハッシュ記号の代わりにスラッシュがある場合があります) を実行します。*.lst
build
- 何か
awk
を出力すると、特定のコードブロックが発行されます。
しかし、私はコンパイラパラメータを使用clang
しているため、使用できません。-Wa
方法は何clang
ですか?コンパイラ オプションを使用してアセンブリ ファイル ( .S
) を出力できることはわかって-S
いますが、大きなプロジェクトでは、ビルド中に依存関係の連鎖がある場合、そのような方法で行うことは困難です。ファイルに加えてアセンブリを出力するには?.o