【问题标题】:C/C++: "for" macro to track loops which are running many iterationsC/C++:“for”宏来跟踪运行多次迭代的循环
【发布时间】:2015-08-19 23:30:42
【问题描述】:

我尝试使用下面的代码使用新变量ForloopCountM 跟踪各个循环的迭代。该代码适用于循环内的循环和一个接一个的循环。但是宏在以下两种情况下失败,我需要帮助我如何解决这个问题并跟踪迭代次数。

void    forloopTrace(int ForloopCount)
{
    if( ForloopCount==50)
    printf("Invalid \n");
}

#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )

#define FORlOOPCOUNTM MACRO_CONCAT(ForloopCountM,__LINE__)

#define for(args...)\
    int FORlOOPCOUNTM=0;\
for(args,FORlOOPCOUNTM++,forloopTrace(FORlOOPCOUNTM))\

int main()
{
    int i,j,x,y;
    j=100;
    y=200;
    for(i=0;i<j;i)   //works fine
    {
        i++;
        for(x=0;x<y;x) //works fine
            x++;
    }
    if(i>0)
       for(;i>0;)    //ERROR
         i--;
    for(;;)   //Error
    {
        i++;
    }

    return 0;
}

【问题讨论】:

  • 点击帖子下方的编辑按钮,将代码放入您的问题中。
  • 这不是无限递归的吗?
  • @cup:宏替换是非递归的,即在宏被替换后,相同的宏替换不再应用于替换产生的代码部分。见stackoverflow.com/a/12447739/908515
  • 重新定义关键字有issues。很确定它实际上是未定义的行为。

标签: c++ c


【解决方案1】:

您可以在ForloopCountM 的声明中添加__LINE__ predefined macro

#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )

#define FORlOOPCOUNTM MACRO_CONCAT(ForloopCountM,__LINE__)

#define for(args...)\
int FORlOOPCOUNTM=0;\
for(args,FORlOOPCOUNTM++)\
    if(FORlOOPCOUNTM==50)\
        printf("\n For loop is running more than 50 iterations !! \n");\
    else

int main()
{
    int i,j,x,y;
    j=100;
    y=200;
    for(i=0;i<j;i)   //works fine
    {
        i++;
        for(x=0;x<y;x) //works fine
            x++;
    }
    for(i=0;i<y;i)   //works fine too :)
    {
        i++;
    }
    return 0;
}

http://ideone.com/kvQ09r

编辑:感谢 user3956566,我添加了一个链接到 gcc 的关于预定义宏的页面

【讨论】:

    【解决方案2】:

    在第一次概述中,如果您的条件是 ForloopCountM==50,您的代码看起来有问题,因为其余的原始代码在 else 路径中运行,然后没有执行。

    下一个问题是你必须在循环之前定义你的变量,让结果在循环之后存在。

    下一个问题是,这根本不是真正有用的代码。如果您认为可以在 for 循环中调试或监视迭代,那么您就错了。编译器可以为您展开代码,或者在编译期间简单地计算结果,或者在给定的循环中什么优化是最好的。您的宏可能会破坏所有可能的优化!这意味着:带有宏的代码会给“真实世界的代码”带来不同的结果。

    如果你真想知道编译的原话是什么!代码做,使用代码覆盖/分析工具。如果您使用 gcc/g++ 运行,请查找 gcov 和 gprof。如果您在打开覆盖/分析的情况下构建代码,您会看到每个代码块的运行频率。这也意味着,循环中的每个代码块正是您所要求的。结果与您的原始代码完全相同,因为覆盖率/分析不会影响优化。

    有多种工具可以从收集的结果中获得良好的打印输出和图形统计信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2013-07-02
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      相关资源
      最近更新 更多