我有一堆.cpp
个文件,它们一起处理类似的数据文件,但大小各异。对于较大的数据文件,我想对.cpp文件中的函数进行一些时序研究。
我想抑制输出这些大数据集的结果,并且只打印时序结果。对于较小的数据集,我想打印到屏幕以验证算法/代码的正确性。
我不想反复评论/取消注释相应的cout
语句并重新编译,而是想使用命令行参数(或其他一些技术)来有选择地抑制输出。
有什么建议吗?我能想到的天真的是使用argc
和argv
,但我不确定它们是否是可以被不同文件中的函数使用的全局变量。
答案 0 :(得分:4)
当然argv
和argc
是不是全局变量,因为它们是main()
的明显功能范围局部变量:
int main(int argc, char * argv[]) { /* ... */ }
为便于选项处理,您可能希望查看getopt.h
。
抑制输出的一种方法是在shell(grep
)上使用time ./prog > /dev/null
或文件重定向,但这仍然会产生实际输出函数的成本。
我建议两个可能的想法:
通过致电clock()
来围绕您的关键职能,并自行进行衡量和报告。
允许用户传递详细程度参数(在运行时使用命令行选项,或在编译时使用#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
然后,您可以使用-DVERBOSE=3
等进行编译,以启用特定级别的日志记录。
如果这太过手动,您应该为您的应用程序寻找合适的日志框架。
答案 1 :(得分:4)
您的直觉是正确的 - 使用传递到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之类的库。
答案 2 :(得分:2)
默认情况下,您必须使用的所有输出都是stdout(作为cout
)和stderr(作为cerr
)。
所以有些选择是:
grep
仅显示您想要查看的输出行。答案 3 :(得分:0)
通常我使用预处理器指令来执行此操作:
/*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
这种方法可以有选择地抑制print语句,但每次都需要重新编译模块。