给定一个只包含单个函数定义的任意C ++源代码,我尝试捕获函数的名称(可以是任意的)。
为此,我假设函数的名称和参数列表之间没有符号/单词,即我正在寻找第一次出现的括号符号" {{ 1}}" (它启动函数的参数列表)并捕获它前面的单词(我认为它是函数的名称);这个程序是正确的吗?
不幸的是,C ++规范(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf第207页)对我来说是不可理解的。
答案 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);
}
击> <击> 撞击>