利用 undef實現特定模組的除錯輸出

2021-10-03 18:20:15 字數 3286 閱讀 4537

在平時的程式設計中肯定會用到列印功能來除錯自己的程式,除錯的時候將列印函式取消注釋,在除錯完成後將列印函式注釋掉。不知大家是如何處理的,我以前可一直是這麼幹的。這樣處理第一太繁瑣,第二影響程式的美觀性。後面想了乙個用#if ... #endif語法來封裝printf函式的做法:

#if debug_moudel

print

("debug moudel\n");

#endif

需要除錯特定模組的時候只需在該模組檔案的開頭新增#define debug_moudel即可。但這樣給寫程式新增了很大的負擔。

對於#undef,在這裡我們知道他的書面意思就夠了,與#define相對,解除對後面巨集的定義。

這是我們用於除錯輸出的核心檔案,在需要除錯的模組檔案中要包含該檔案,並在之前新增上# define debug_out的巨集定義便可開啟該模組的除錯。除錯完成後只需將#define debug_out的巨集注釋掉即可。

#include

//用於除錯的序列別名。

//用法:在給定的.cpp檔案中定義debug_out(或不定義)後,包括此標頭

//用於特定模組(檔案)的除錯

#define noop

//(void(0))

#undef debug_print

#if debug_out

#define debug_print printf

#else

#define debug_print(...) noop

#endif

#undef debug_out

moudel1.h

#ifndef __moudel1_h

#define __moudel1_h

#define debug_out

//除錯moudel1

#include

"debug_out.h"

void

moudel1

(void);

#endif

moudel1.c

#include

"moudel1.h"

void

moudel1

(void

)

moudel2.h

#ifndef __moudel2_h

#define __moudel2_h

//#define debug_out //不除錯moudel2

#include

"debug_out.h"

void

moudel1

(void);

#endif

moudel2.c

#include

"moudel2.h"

void

moudel2

(void

)

#include

#include

"moudel1.h"

#include

"moudel2.h"

intmain

(void

)

c:\users\username\desktop\c_cpp\debug_test>gcc main.c moudel1.c moudel2.c -o main

c:\users\username\desktop\c_cpp\debug_test>.\main.exe

test debug out:

moudel1 debug...

note:

#define debut_out只能定義在要除錯的模組檔案中才行,如果想在統一的檔案中定義是否除錯某個模組可以轉一層定義,下面是一種思路:

#define debug_out defined(debug_moudel1)
在配置檔案中定義#define debug_moudel1,只需在上面**之前包含配置檔案即可。

針對於moudel1.c檔案將所有的預處理展開後如下:

/* moudel1.h start */

#ifndef __moudel1_h

#define __moudel1_h

#define debug_out

//除錯moudel1

/* debug_out.h start */

#include

//用於除錯的序列別名。

//用法:在給定的.cpp檔案中定義debug_out(或不定義)後,包括此標頭

//用於特定模組(檔案)的除錯

#define noop

//(void(0))

#undef debug_print

#if debug_out

#define debug_print printf

#else

#define debug_print(...) noop

#endif

#undef debug_out

/* debug_out end */

void

moudel1

(void);

#endif

/* moudel1.h end */

void

moudel1

(void

)

首先定義了debug_out自然條件編譯在選擇時是#define debug_print printf故該模組中的debug_print當做printf對待。後面又有一句#udef debug_out解除對debug_out的定義故對其他未定義debug_out的模組,預處理中條件編譯的選擇是#define debug_print(...) noop,即debug_print是乙個空函式。

利用PyCharm實現Python遠端除錯

python遠端除錯 一 介紹 python遠端除錯,即在遠端機器上執行python 在本地進行除錯。需要環境 python 除錯環境 pycharm 需要依賴 遠端和本地需要在python路徑安裝pycharm debug.egg 注 安裝egg包需要使用先安裝setuptools 二 安裝set...

利用CVXOPT模組實現SVM

執行安裝 pip install numpy whl cvxopt踩坑指南 優化中傳遞的matrix必須是cvxopt內的matrix matrix 轉換對應的型別為numpy.array,numpy.matrix可能也行 沒有嘗試 python 3 import numpy as np from ...

利用Nginx geo模組實現CDN排程的配置方法

引入nginx的geo模組 geo指令使用ngx http geo module模組提供的。預設情況下,nginx有載入這個模組除非人為的 without http geo module。ngx http geo module模組可以用來建立變數,其值依賴於客戶端ip位址。使用方法如下 geo指令 ...