我最近参加了一次编程面试,被问到一个我不知道答案的问题。在网上搜索了几天的答案后,我来这里求助。
问题描述如下:你应该提出一种方法来记录你程序中函数的运行信息,例如,函数被调用的次数等等。
顺便说一句,您不能修改这些功能。也许你想在这些函数中定义一个全局变量来记录正在运行的函数,但这是不允许的。
好的!这就是我在编码面试中遇到的问题。
我最近参加了一次编程面试,被问到一个我不知道答案的问题。在网上搜索了几天的答案后,我来这里求助。
问题描述如下:你应该提出一种方法来记录你程序中函数的运行信息,例如,函数被调用的次数等等。
顺便说一句,您不能修改这些功能。也许你想在这些函数中定义一个全局变量来记录正在运行的函数,但这是不允许的。
好的!这就是我在编码面试中遇到的问题。
这是我能想到的最好的使用C++ 宏的方法。不知道是否符合要求。
一个非常基本的版本,只是记录计数。宏用宏的内容替换所有现有的函数调用,宏的内容记录统计数据并调用函数。可以轻松扩展以记录更多细节。假设只有一个具有该名称的函数,或者您希望对所有函数进行计数。每个函数都需要一个宏。
// here's our function
void func()
{ /* some stuff */ }
// this was added
int funcCount = 0;
#define func(...) do { funcCount++; func(__VA_ARGS__); } while(0)
int main()
{
// call the function
func();
// print stats
cout << funcCount << endl;
return 0;
}
打印1
。
更通用的版本。需要更改函数的调用方式。
// here are our functions
void someFunc()
{ /* some stuff */ }
void someOtherFunc()
{ /* some stuff */ }
// this was added
map<string, int> funcCounts;
#define call(func, ...) do { funcCounts[ #func ]++; func(##__VA_ARGS__); } while(0)
int main()
{
// call the functions
// needed to change these from 'someFunc();' format
call(someFunc);
call(someOtherFunc);
call(someFunc);
// print stats
for (map<string, int>::iterator i = funcCounts.begin(); i != funcCounts.end(); i++)
cout << i->first << " - " << i->second << endl;
return 0;
}
印刷:
someFunc - 2
someOtherFunc - 1