C++记录每个函数和参数值
C++ log every function and parameter values
我想记录C++应用程序中的每个函数调用和参数值。下面是我想出的代码:
头文件:
#pragma once
class Deneme1
{
public:
Deneme1(void);
~Deneme1(void);
int Deneme1::foo1(double &a);
int Deneme1::foo2(double &a);
struct Logger
{};
template <typename T>
struct LogReturner
{
T* ptrReturnValue;
Logger& theLog;
LogReturner(Logger& log, T* retVal) : theLog(log), ptrReturnValue(retVal) { }
~LogReturner() { /**/ }
};
#define EXPAND_ARGS(...) __VA_ARGS__;
#define LOG_FUNCTION_CALL(x, logger, varName, ar) x varName; LogReturner<x> LR(logger, &varName); FuncCall(__FUNCTION__, EXPAND_ARGS ar);
Logger globLogger;
};
Cpp文件:
#include "Deneme1.h"
#include "FuncCall.h"
Deneme1::Deneme1(void)
{
}
Deneme1::~Deneme1(void)
{
}
int Deneme1::foo1(double &a)
{
LOG_FUNCTION_CALL(int, globLogger, returnValue,EXPAND_ARGS());
Deneme1 c;
double d = 5;
c.foo2(d);
return returnValue;
}
int Deneme1::foo2(double &a)
{
LOG_FUNCTION_CALL(int, globLogger, returnValue);
return returnValue;
}
负责处理日志功能的.h文件:
#pragma once
#include <stdio.h>
#include <cstdarg>
#include <iostream>
class FuncCall
{
public:
FuncCall(const char * lpszFuncName, ...) {
printf(lpszFuncName);printf("n");
va_list arguments;
double sum = 0;
int num = 1;
va_start ( arguments, num );
for ( int x = 0; x < num; x++ )
std::cout << va_arg ( arguments, double ) << std::endl;
va_end ( arguments );
}
~FuncCall() { printf("func return ");printf("n"); }
};
但编译器抱怨在"LOG_FUNCTION_CALL"中找不到"EXPAND_ARGS"。实际上,我不知道如何正确地调用"LOG_FUNCTION_call"。
谢谢。
对于免费函数,这可能要简单得多:
template <typename F, typename ...Args>
auto function_call_impl(F f, char const * fname, Args &&... args)
-> decltype(f(std::forward<Args>(args)...))
{
std::cout << "Calling function '" << fname << "'n";
return f(std::forward<Args>(args)...);
}
#define CALL(function, ...) function_call_impl(function, #function, __VA_ARGS__)
用法:
int foo(double, char, bool);
int main()
{
return CALL(foo, 0.5, 'x', false);
}
只要做一点额外的工作,你也可以打印出论点。
从代码中,您似乎必须列出第四个参数的参数
LOG_FUNCTION_CALL(int, globLogger, returnValue, a);
不确定为什么需要EXPAND_ARGS而不是直接使用。。。在LOG_FUNCTION_CALL 中
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类