C 宏,用于跟踪现有源代码中的"for"循环迭代

C MACRO to trace the "for" loop iteration in the existing source code

本文关键字:for 迭代 循环 源代码 用于 跟踪      更新时间:2023-10-16

我需要 c/c++ 宏来跟踪现有源代码中的"for"循环迭代,并在循环运行超过 50 次迭代时打印一些消息。注意:宏不应更改代码的现有功能。我尝试了一些逻辑C/C++:"for"宏来跟踪正在运行多次迭代的循环,但它并非在所有情况下都有效!

  int main()
  {
    int i,j,x,y;
    j=100;
    y=200;
    //case 1
    for(i=0;i<j;i++)   
        for(x=0;x<y;x) 
        x++;

    //case 2
    if(i>0)
      for(;i>0;)    
        i--;
     //case 3
     for(;;)  
     {
        i++;
     }
     return 0;
}

下面是通过所有三种情况的概念证明:

// Max lines in a file you are profiling
#define MAX_LINES 65535
// Array to count all iterations, initialized to zero
uint32_t iterations[MAX_LINES];
// Increments the iteration for the given line, returns non-zero
#define ITER(ln)  ++iterations[ln]
// Override for definition
#define for(...) for(__VA_ARGS__) if (!ITER(__LINE__)) { } else

这里的限制是每行只能有一个for,否则它将合并它们的迭代。所以,这没关系:

for(i=0;i<j;i++)   
    for(x=0;x<y;x)
        x++;

但这不是:

for(i=0;i<j;i++) for(x=0;x<y;x) x++;

另一个限制是我们为每行定义一个数组。您可以轻松地将其设置为哈希图或其他内容,但这与此示例无关。使用哈希映射,您可以使用__LINE__#x(循环的字符串表示形式)来构造 ID,因此第一个限制也基本消失。