在编译时复制C/C++函数

Dan*_*son 3 c++ templates inlining c-preprocessor

如果我有一个函数A(),我有兴趣找到一个方便的方法来创建一个功能B()完全相同的函数A(),仅在名称上有所不同.新功能将是一次性使用.目的是在一个有点原始的抽样分析器中区分对相同函数的调用,并且复制函数仅在此上下文中使用.也就是说,它永远不会触及生产代码,只能用于修补.

首先猜测是一个宏,它声明一个名为的函数,BA()在其内部创建一个内联调用.这里的问题是我不知道GCC中强制任意函数调用内联的方法; 似乎所有内联选项都是函数声明而不是调用.

使用模板可能有一些深奥的方法,或者可能通过欺骗编译器进行内联.我不确定这是可能的.有什么想法吗?不幸的是,新的C++标准不可用,如果它会有所作为.

Ser*_*dar 7

使用模板

template<int x>
void A()
{
    // ..
}

int main()
{
    A<0>();
    A<1>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新

编译器可能太聪明,只为A <0>和A <1>创建一个主体.至少Visual C++ 2010在发布模式下完成它.要防止它,只需在日志或断言中使用函数模板体内的模板参数.例如,

#include <iostream>

template<int x>
void A()
{
    ::std::cout << x << std::endl;
    // ..
}

int main()
{
    A<0>();
    A<1>();
    auto v0 = A<0>;
    auto v1 = A<1>;
    ::std::cout << v0 << std::endl;
    ::std::cout << v1 << std::endl;
    ::std::cout << (v0 == v1) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)