在平時的程式設計中肯定會用到列印功能來除錯自己的程式,除錯的時候將列印函式取消注釋,在除錯完成後將列印函式注釋掉。不知大家是如何處理的,我以前可一直是這麼幹的。這樣處理第一太繁瑣,第二影響程式的美觀性。後面想了乙個用#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指令 ...