c++ 有可以代替 __FUNCTION__ 的类吗
时间: 2024-09-22 12:02:18 浏览: 47
在C++中,`__FUNCTION__` 是一个预处理器宏,用于获取当前函数名,但它不是一个真正的类或对象。如果你想在程序中模拟类似的功能并提供更好的可读性和灵活性,可以自定义一个命名空间或者类来替代。
例如,你可以创建一个简单的类模板:
```cpp
#include <type_traits>
#include <iostream>
class FunctionName {
public:
template<typename F>
FunctionName(F &&func) : function_({typeid(func).name(), func}) {}
const char* get() const {
return function_[0].c_str();
}
private:
std::pair<const char*, decltype(&function_)> function_;
};
// 使用示例
void myFunction() {
FunctionName fn = FunctionName(myFunction);
std::cout << "Current function name: " << fn.get() << '\n';
}
```
这个`FunctionName`类可以根据传入的函数获取其名字。但是需要注意的是,这种方法并不像`__FUNCTION__`那样精确地匹配函数地址,它依赖于类型标识符而不是实际的函数指针。
相关问题
_FUNCTION_宏有什么代替的吗,我只想输出函数名,而不包含命名空间和类名
`_FUNCTION_` 宏在C++中主要用于内部使用,它通常会插入当前函数的名称,包括命名空间、类名以及函数名。如果你只想输出函数名,而不包含命名空间和类名,你可以使用 `__PRETTY_FUNCTION__` 这个C++11引入的预处理器宏,或者在某些编译器环境下,如GCC,直接使用 `__func__`。
例如,如果你想简单地打印函数名,你可以这样做:
```cpp
#include <iostream>
void myFunction() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
myFunction();
return 0;
}
```
这段代码将只输出 `myFunction()` 而不是 `namespace::ClassName::myFunction()`。
如果你想避免依赖特定版本的预处理器特性,可以编写一个简单的函数模板来提取函数名:
```cpp
#include <typeinfo>
std::string function_name() {
return typeid(std::declval<decltype(__func__)>().*__func__).name();
}
int main() {
void myFunction() {};
std::cout << function_name() << std::endl; // 输出 "myFunction"
return 0;
}
```
这个函数会提取出函数的名称,但请注意这并不是所有的编译器都支持。
我使用了__FUNCTION__,ide就会警告应该使用gsl::array_view或常量表达式代替,怎么消除这个警告,用代码说明
`__FUNCTION__` 是C++标准库中的一种宏,它会返回当前正在调用的函数名,主要用于调试目的。然而,现代C++推荐使用更安全和高效的特性来替代。
`gsl::array_view` 是Google C++ Style Guide (GSL)的一部分,用于提供对数组的无所有权视图,有助于避免不必要的复制和提高性能。如果你想消除IDE关于`__FUNCTION__`的警告,可以考虑以下几个步骤:
1. 如果你在访问数组元素,使用`gsl::span` 或 `gsl::array_view`,它们提供类似`const gsl::array<T, N>::view& array_view`这样的常量引用,这将确保数组不会被意外改变,并且不会引起警告。
```cpp
gsl::array<int, 10> arr = {1, 2, ...};
auto const array_view = arr; // 使用const引用,表示不打算修改arr
```
2. 如果你需要在运行时确定函数名,可以使用`std::current_function`而不是`__FUNCTION__`,因为它更容易理解和维护。但是,这依然不是最佳实践,因为`std::current_function`只在C++17及更高版本可用,而且它也不是常量表达式,所以无法在某些优化设置下优化掉。
```cpp
#include <iostream>
#include <type_traits>
void some_func() {
if constexpr (std::is_same_v<decltype(&some_func), void(*)()>)
std::cout << "__FUNCTION__: " << __FUNCTION__ << '\n'; // C++17及以上
else
std::cout << "std::current_function: " << std::current_function << '\n';
}
```
阅读全文