0

特定のコードが出力されていないことを確認するにはどうすればよいですか?

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インライン アセンブリを表示するコマンド (ハッシュ記号の代わりにスラッシュがある場合があります) を実行します。*.lstbuild
  • 何かawkを出力すると、特定のコードブロックが発行されます。

LIVE DEMO

しかし、私はコンパイラパラメータを使用clangしているため、使用できません。-Wa方法は何clangですか?コンパイラ オプションを使用してアセンブリ ファイル ( .S) を出力できることはわかって-Sいますが、大きなプロジェクトでは、ビルド中に依存関係の連鎖がある場合、そのような方法で行うことは困難です。ファイルに加えてアセンブリを出力するには?.o

4

0 に答える 0