捕获函数名称

时间:2016-11-17 20:02:44

标签: c++ function specifications

给定一个只包含单个函数定义的任意C ++源代码,我尝试捕获函数的名称(可以是任意的)。

为此,我假设函数的名称和参数列表之间没有符号/单词,即我正在寻找第一次出现的括号符号" {{ 1}}" (它启动函数的参数列表)并捕获它前面的单词(我认为它是函数的名称);这个程序是正确的吗?

不幸的是,C ++规范(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf第207页)对我来说是不可理解的。

2 个答案:

答案 0 :(得分:2)

函数返回类型可能非常奇怪,例如

void foo(int t){}

void (* returnFptr())(int t){
    return foo;
}

returnFptr()的返回类型为void(*)(int)。因此,不能保证第一个开括号位于函数名称和参数列表之间。

答案 1 :(得分:2)

  

我正在寻找第一次出现的括号符号“(”(它启动函数的参数列表)并捕获它前面的单词(我认为它是函数的名称);这是正确的?

不,这不对。在最基本的情况下,这是真的:

int foo() {
    return 1;
}

但是如果你想支持任何功能(非模板),那么这种情况就会失败:

std::function<int(int)> foo() {
    return [](int) { return 1; };
}

检查返回类型和函数名之间的空格也是一个坏主意,因为编译器会忽略大多数空格,即这将失败:

std::function< int ( int ) > foo( ) {
    return [](int) { return 1; };
}

那么,你怎么做呢? 您需要构建一个部分C ++解析器来分析函数定义。

您没有其他方法可以支持每个非模板功能,如果添加模板功能,则会更难。返回类型可以包含任何字符,没有特殊的分隔符可用。

你也可以有函数指针,它们内置了语言并打破了下面的空格+括号搜索。您需要构建一个解析器:(

为简化起见,您可以禁止任何#include语句,这只会导致第一个语句等基本功能。如果是这种情况,为什么不找到第一个空格并获取空格和(之间的所有内容? (符号并获得前面的单词。 > <击>

std::string get_function_name(std::string source) {
    auto whitespace = source.find(' ');
    if (whitespace == std::string::npos)
        return "";

    auto open_bracket = source.find('(', whitespace); // find ( after whitespace
    if (open_bracket == std::string::npos)
        return "";

    return source.substr(whitespace + 1, open_bracket - whitespace);
}

<击>