我有一堆.cpp
文件,它们一起处理类似但大小不同的数据文件。对于较大的数据文件,我想对 .cpp 文件中的函数进行一些时序研究。
我想抑制输出这些大数据集的结果,只打印计时结果。对于较小的数据集,我想打印到屏幕上以验证算法/代码的正确性。
我不想重复注释/取消注释适当的cout
语句并重新编译,我想使用命令行参数(或其他一些技术)来选择性地抑制输出。
有什么建议么?我能想到的最简单的方法是使用argc
and argv
,但我不确定它们是否是全局变量,可以被不同文件的函数使用。
当然argv
并且argc
不是全局变量,因为它们显然是函数范围的局部变量main()
:
int main(int argc, char * argv[]) { /* ... */ }
为了方便选项处理,您可能希望查看getopt.h
.
抑制输出的一种方法是grep
在 shell ( ) 上使用或文件重定向time ./prog > /dev/null
,但这仍然会产生实际输出函数的成本。
我提出两个可能的想法:
通过调用您的关键功能clock()
并自己进行测量和报告。
允许用户传递详细程度参数(在运行时使用命令行选项,或在编译时使用 a #define
)并且仅根据详细程度级别进行打印。
对于想法(1),我使用以下宏:
#define CLOCK_TICK(acc, ctr) ctr = std::clock()
#define CLOCK_TOCK(acc, ctr) acc += (std::clock() - ctr)
#define CLOCK_RESET(acc) acc = 0
#define CLOCK_REPORT(acc) 1000. * double(acc) / double(CLOCKS_PER_SEC)
对于想法(2),我会做这样的事情:
#ifndef VERBOSE
# define VERBOSE 0
#endif
#if VERBOSE > 0
// print level 1
#if VERBOSE > 1
// print level 2
#endif
#endif
然后,您可以使用 etc. 进行编译-DVERBOSE=3
以启用特定级别的日志记录。
如果这过于手动,您应该为您的应用程序寻找合适的日志框架。
你的直觉是正确的——使用传递给你的函数的argc
和值——但它们不是全局变量。您需要以某种方式使您的信息全局化:我建议解析一次参数,并保留一组可以轻松查询的全局标志。argv
main
例如:
// In a common header file that gets included in each source file
extern bool g_bFlag1;
extern bool g_bFlag2;
...
// In your main source file
bool g_bFlag1 = false;
bool g_bFlag2 = false;
...
int main(int argc, char **argv)
{
// Parse command line and store results in global flags
for (int i = 1; i < argc; i++)
{
if (strcmp(argv[i], "--flag1") == 0)
g_bFlag1 = true;
else if (strcmp(argv[i], "--flag2") == 0)
g_bFlag2 = true;
else
; // etc.
}
}
// In any other source file:
if (g_bFlag1)
{
// do stuff if and only if g_bFlag1 is set
}
--flag1
然后你可以在命令行上传递。对于更复杂的参数解析,我建议使用诸如GNU getopt之类的库。
默认情况下,您必须使用的所有输出都是 stdout (as cout
) 和 stderr (as cerr
)。
所以一些选项是:
grep
在命令行上使用以仅显示您想要查看的输出行。通常我使用预处理器指令来做到这一点:
/*inside file_name.cpp*/
//uncomment next line to activate debug print on this file
//#define FILE_NAME_DEBUG
#ifdef FILE_NAME_DEBUG
cout << "activate debug print\n";
#endif
这种方法可以选择性地抑制打印语句,但每次都需要重新编译模块。