2016-06-21 64 views
0

我有一個多層次調試實現的代碼片段,我不知道如何使它工作。multilevel使用c預處理器宏調試

我已經嘗試了一些關於使用do {...} while(0)發佈的建議,並且我還試圖聲明一個名爲Debug的全局變量,但它們都不起作用。

我該怎麼辦?

#include <stdio.h> 
#include <stdlib.h> 

//#define DEBUG(fmt, ...) fprintf (stderr, fmt, __VA_ARGS__) 

#ifdef DEBON 
    #define DEBUG(level, fmt, ...) \ 
     if (Debug >= level) \ 
      fprintf (stderr, fmt, __VA_ARGS__) 
#else 
    #define DEBUG(level, fmt, ...) 
#endif 

int process (int i1, int i2) 
{ 
    int val; 

    DEBUG (1, "process (%i, %i)\n", i1, i2); 
    val = i1 * i2; 
    DEBUG (3, "return %i\n", val); 

    return val; 
} 

int main (int argc, char *argv[]) 
{ 
    int arg1 = 0, arg2 = 0; 
    if (argc > 1) 
     arg1 = atoi (argv[1]); 
    if (argc == 3) 
     arg2 = atoi (argv[2]); 

    DEBUG (1, "processed %i arguments\n", argc -1); 
    DEBUG (3, "arg1 = %i, arg2 = %i\n" , arg1, arg2); 
    printf ("%d\n", process (arg1, arg2)); 

    return 0; 
} 

下面是一個更簡單的文件,我把它放在一起看看我能否得到這個工作。沒有運氣。

#define DEBUG(level, fmt, ...) if (Debug >= level) fprintf (stderr, fmt, __VA_ARGS__) 
#include <stdio.h> 
int Debug; 
int main() 
{ 
int i1 = 1; 
int i2 = 2; 
DEBUG(3, "process (%i, %i)\n", i1, i2); 

} 
+0

您應該從原始源複製包含調試定義的枚舉。 – martinkunev

+0

除了我分享的內容之外,我沒有其他任何東西。我只知道它應該工作的方式是通過使用-d選項執行程序並指定所需的調試級別。即a.out -d3將提供最詳細的。我無法弄清楚這個值是如何作爲Debug值傳遞給代碼的,以及它爲什麼不能在我的情況下工作。 – maverick

+0

您引用的選項(-d3)實際上指定了要在可執行文件中包含多少調試信息。使用調試器時可以訪問這些信息。你想要的是-DDebug = 3 – martinkunev

回答

0

你最後一個例子在小的調整後工作。本書中的想法是讓程序解析命令行選項並設置名爲Debug的全局變量的值。

#include <stdio.h> 
#include <stdlib.h> 
#define DEBUG(level, fmt, ...) do if (Debug >= level) fprintf(stderr, fmt, __VA_ARGS__); while (0) 

int Debug = 1; // default debug level == 1 

int main(int argc, char *argv[]) 
{ 
    int i1 = 1; 
    int i2 = 2; 

    size_t i; 
    for(i = 1; i < argc; ++i) 
     if ((argv[i][0] == '-') && (argv[i][1] == 'd')) 
      Debug = strtol(argv[i] + 2, 0, 10); 

    DEBUG(3, "process (%i, %i)\n", i1, i2); 
    return 0; 
} 
+0

根據我所關注的內容,Stephen Kochan編寫的C編程,一個應該只能執行a.out -d1,-d2,-d3並獲得不同的調試級別。 – maverick