选择性抑制输出到终端C ++。

时间:2011-09-20 22:16:11

标签: c++ terminal argc

我有一堆.cpp个文件,它们一起处理类似的数据文件,但大小各异。对于较大的数据文件,我想对.cpp文件中的函数进行一些时序研究。

我想抑制输出这些大数据集的结果,并且只打印时序结果。对于较小的数据集,我想打印到屏幕以验证算法/代码的正确性。

我不想反复评论/取消注释相应的cout语句并重新编译,而是想使用命令行参数(或其他一些技术)来有选择地抑制输出。

有什么建议吗?我能想到的天真的是使用argcargv,但我不确定它们是否是可以被不同文件中的函数使用的全局变量。

4 个答案:

答案 0 :(得分:4)

当然argvargc不是全局变量,因为它们是main()的明显功能范围局部变量:

int main(int argc, char * argv[]) { /* ... */ }

为便于选项处理,您可能希望查看getopt.h


抑制输出的一种方法是在shell(grep)上使用time ./prog > /dev/null或文件重定向,但这仍然会产生实际输出函数的成本。

我建议两个可能的想法:

  1. 通过致电clock()来围绕您的关键职能,并自行进行衡量和报告。

  2. 允许用户传递详细程度参数(在运行时使用命令行选项,或在编译时使用#define)并且仅根据详细级别进行打印。

  3. 对于想法(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函数中的argvmain值 - 但它们不是全局变量。您需要以某种方式使您的信息全局化:我建议解析一次参数,并保留一组可以轻松查询的全局标志。

例如:

// 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)。

所以有些选择是:

  • 将你的时间写入stderr,而不是stdout,并将它们通过命令行传送到不同的地方
  • 打开您的计时数据的日志文件,并写入
  • 使用类似“[timing]”的内容标记输出的每一行,然后在命令行上使用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语句,但每次都需要重新编译模块。