2017年4月25日 星期二

C語言巨集篇 -- C preprocessor (節錄Gcc Macro Manual)

https://gcc.gnu.org/onlinedocs/cpp/Macros.html



本篇將快速介紹C語言巨集的用法,以及一些實用的技巧


巨集(Macro)最基本的用法,就是拿來定義常數,或是拿來定義一段程式碼區塊,其中 '\' 符號在巨集中表示換行,下面是一個例子
#define BUFFER_SIZE 1024
#define NUMBERS 1, \
                2, \
                3
foo = (char *) malloc (BUFFER_SIZE);
int x[] = { NUMBERS };
你可以用以下指令來察看前處理器將巨集語法編譯後的結果,你會發現所謂的巨集就是拿來做語法上的字串替換
gcc -E -P XXX.c 
像上面這一段程式碼經過前處理器編譯後變成
foo = (char *) malloc (1024);
int x[] = { 1, 2, 3 };
以下將用註解呈現編譯後的結果

C語言前處理器的編譯是循序的,因此巨集必須先定義才會生效,以下是個例子
foo = X;
#define X 4
bar = X;

//前處理器編譯後變成
//foo = X;
//bar = 4;
實際上巨集定義是能包含其他巨集名稱的,例如
#define TABLESIZE BUFSIZE
#define BUFSIZE 1024
//此時TABLESIZE變成1024
另一個有趣的例子,先定義BUFSIZE後,再重新定義BUFSIZE,結果很有趣
#define BUFSIZE 1020
#define TABLESIZE BUFSIZE
#undef BUFSIZE
#define BUFSIZE 37


//此時TABLESIZE為37,
//不管何時使用TABLESIZE,TABLESIZE都會是37不會是1020

2017年4月2日 星期日

列印gcc 預設include path

列印gcc 預設include path:
echo | gcc -E -Wp,-v -

列印c++預設include path:
echo | cpp -xc++ -Wp,-v 

搜尋含有關鍵字的檔案

在bash中輸入以下指令,可以搜尋src資料夾下,
包含main關鍵字的檔案,並印出該關鍵字出現在該檔案的行號
grep -nr main ./src

執行結果:
src/main.c~:273:capture_main(const char* interface, void (*pkt_handler)(void*), int livemode){
src/main.c~:319:int main(int argc, char *argv[]){
src/main.c~:376: /* Start main capture in live or offline mode */
src/main.c~:378: capture_main(interface, packet_queue_enq, 1);
src/main.c~:381: capture_main(tracefile, packet_queue_enq, 0);


或者配合find指令
find ./src -type f -exec grep -nH -e main {} +


執行結果:
src/main.c~:273:capture_main(const char* interface, void (*pkt_handler)(void*), int livemode){
src/main.c~:319:int main(int argc, char *argv[]){
src/main.c~:376: /* Start main capture in live or offline mode */
src/main.c~:378: capture_main(interface, packet_queue_enq, 1);
src/main.c~:381: capture_main(tracefile, packet_queue_enq, 0);


兩者的差別是,第1種會將結果上色,比較利於閱讀。