2013-07-02 36 views
0

的代碼塊下面列出我發現在PPP項目的chat.ca模塊代碼塊,但我無法理解

/*************** Micro getopt() *********************************************/ 
#define OPTION(c,v) (_O&2&&**v?*(*v)++:!c||_O&4?0:(!(_O&1)&& \ 
       (--c,++v),_O=4,c&&**v=='-'&&v[0][1]?*++*v=='-'\ 
       &&!v[0][1]?(--c,++v,0):(_O=2,*(*v)++):0)) 
#define OPTARG(c,v) (_O&2?**v||(++v,--c)?(_O=1,--c,*v++): \ 
       (_O=4,(char*)0):(char*)0) 
#define OPTONLYARG(c,v) (_O&2&&**v?(_O=1,--c,*v++):(char*)0) 
#define ARG(c,v) (c?(--c,*v++):(char*)0) 

static int _O = 0;  /* Internal state */ 
/*************** Micro getopt() *********************************************/ 

我知道這個宏用於獲得主要功能的ARGS ,但沒有完全理解它。 現在問題是_O在這個區塊中的含義是什麼,它是如何工作的。

+0

這只是一個正常的靜態變量。它會在不同的宏中分配不同的值。至於它的用途?它是*內部的*,你不需要擔心什麼。 –

+1

http://en.wikipedia.org/wiki/Getopt – hit

+1

這是誰? – alk

回答

0

就像評論所說,宏是用來記住它們在哪裏以及它們在做什麼的內部狀態。除非您正在重新實現代碼,否則沒有必要擔心,在這種情況下,除了該評論和一般編碼風格外,完全缺乏文檔表明您可能遇到問題。

由於它是靜態的,它只能從該文件訪問(如果代碼來自頭文件,上帝會幫助你),並且它的生存期與執行程序相同。

但基本上,你不應該在代碼中觸摸_O。