首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用宏#获取函数指针的函数名

使用宏#获取函数指针的函数名
EN

Stack Overflow用户
提问于 2018-11-07 16:46:17
回答 1查看 153关注 0票数 1

我有一个助手类定义如下:

DataGuard.h

代码语言:javascript
复制
template<typename T, typename D>
class DataGuard {
public:
  typedef MY_STATUS( *FunctionType )( const T*, D* );

private:
  bool               _isSuccess;
  D&                 _data;
  const FunctionType _function;

public:
  explicit DataGuard( D& data, FunctionType& function, const T* ptr );
  ~DataGuard();
  bool isSuccess() const;
};
#define DATAGUARD( Type ) const DataGuard<Type, Type##Data>

#include "DataGuard.inl"

DataGuard.inl

代码语言:javascript
复制
#define GET_FUNCTION_NAME( functionName ) #functionName

template<typename T, typename D>
DataGuard<T,D>::DataGuard( D& data, FunctionType& function, const T* ptr ) :
  _data( data ),
  _function( function )
{
  auto iReturn = function( ptr, &data );
  _isSuccess = iReturn == MY_SUCCESS;
  if( !_isSuccess ) {
    Utility::logErrorMessage( GET_FUNCTION_NAME( _function ), iReturn );  
  }
}

template<typename T, typename D>
DataGuard<T,D>::~DataGuard() {
  if( _isSuccess ) {
    _function( NULL, &_data );
  }
}

template<typename T, typename D>
bool DataGuard<T,D>::isSuccess() const {
  return _isSuccess;
}

这个助手类的调用方式如下:

代码语言:javascript
复制
DATAGUARD( MyObject ) guard( data, MyObjectGet, ptr );

问题是,如果DataGuard构造函数中有错误,我打印的错误消息显示的是_function,而不是所需的MyObjectGet函数名。

你知道为什么GET_FUNCTION_NAME宏会让我失望吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-07 17:02:06

你不能从函数内部去做。

你可以在外部做:

代码语言:javascript
复制
DATAGUARD( MyObject ) guard( data, MyObjectGet, ptr );

我要改变这一点:

代码语言:javascript
复制
#define  DG(data, func, ptr)     data, func, ptr, #func

// usage is now:
DATAGUARD( MyObject )  guard(DG(guard, data, MyObjectGet, ptr));

您将注意到,我们将函数指针和函数指针的名称作为最后一个参数作为引用字符串传递。可以将此字符串用作错误消息的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53194063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档