如何确保是否不发出某些特定代码?
说,我试图写类似 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
打印一些东西,则发出特定的代码块。
但我使用clang
,因此不能使用-Wa
编译器参数。有什么办法clang
?我知道我可以.S
使用-S
编译器选项发出汇编文件(),但是在大型项目中,如果在构建过程中存在依赖链,则很难以这种方式进行。除了文件之外,如何发出程序集.o
?