0

如何确保是否不发出某些特定代码?

说,我试图写类似 a static switch(or static if) 的东西,我希望检测是否operator ()发出了第二个 lambda 的主体:

#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打印一些东西,则发出特定的代码块。

LIVE DEMO

但我使用clang,因此不能使用-Wa编译器参数。有什么办法clang?我知道我可以.S使用-S编译器选项发出汇编文件(),但是在大型项目中,如果在构建过程中存在依赖链,则很难以这种方式进行。除了文件之外,如何发出程序集.o

4

0 回答 0