如何在将C ++宏作为参数传递给另一个宏之前对其进行扩展

时间:2019-11-20 17:21:00

标签: c++

我有以下示例C ++代码:

#include <iostream>

#define TEST( function ) \
    [](){\
        std::cout << function << std::endl;\
    }()

int main (int argc, char *argv[]) { 
    std::cout << __FUNCTION__ << std::endl;
    TEST(__FUNCTION__);
}

当我运行它时,我得到以下输出:

main
main::<lambda_e118d547a20d031f709c1a0a4ae901df>::operator ()

这表明__FUNCTION__在宏TEST中展开了

我想要的是能够在将__FUNCTION__传递给宏TEST并获得以下输出之前进行扩展:

main
main

2 个答案:

答案 0 :(得分:3)

__FUNCTION__不是宏,它是一个静态变量。 (请参见GCC manual。)

因此,如果它以lambda结尾,则无法在main的上下文中对其进行“扩展”。


使TEST成为常规函数将解决此问题。

答案 1 :(得分:1)

这是我解决此问题的方法:

#include <iostream>

#define TEST \
    [](const char* function){\
        std::cout << function << std::endl;\
    }(__FUNCTION__)

int main (int argc, char *argv[]) { 
    std::cout << __FUNCTION__ << std::endl;
    TEST;
}

现在输出为:

main
main