2010-04-09 80 views

回答

5

因爲標題塊說,他們不知道是否要使用ANSI編譯器或K編譯器,並且這個marco允許它們將參數保留在ANSI版本中,並將它們丟棄在K & R build。

00033 /* Keep everything for ANSI prototypes. */ 
00034 #define _PROTOTYPE(function, params) function params 

00045 /* Throw away the parameters for K&R prototypes. */ 
00046 #define _PROTOTYPE(function, params) function() 

這意味着

00483 _PROTOTYPE(void _exit, (int _status) ); 

ANSI下變爲:

void _exit(int _status); 

和下ķ& R:

void _exit(); 
3

的您鏈接到源代碼解釋它:

00009 *如果_ANSI最終被定義,宏
00010 *
00011 * _PROTOTYPE(函數,則params)
00012 *
00013 *已定義。該宏以不同的方式擴展,根據需要生成
00014 * ANSI標準C原型或舊式K & R(Kernighan & Ritchie)
00015 *原型。最後,一些程序使用_CONST,_VOIDSTAR等
00016 *,以便它們可以通過ANSI和K & R編譯器進行移植。
00017 *在此定義適當的宏。

舊式ķ& [R原型有說法第一,那麼類型:

int foobar (x, y) 
    int x; 
    float *y; 
{ 
    /* code */ 
} 

ANSI標準的原型在開始結合他們兩個:

int foobar (int x, float *y) { 
    /* code */ 
} 

_PROTOTYPE宏根據是否定義了_ANSI來創建任一類型的適當簽名。在這種特定情況下,函數實現使用K & R簽名,但函數聲明或者包含或忽略它們的參數,具體取決於是否定義了_ANSI

值得注意的是,K & R風格的聲明可以追溯到1978年,現在大多數C代碼將使用現代ANSI風格的簽名。你很少需要支持這兩者。

+0

雖然你顯示的是函數定義的參數,但宏是用於函數聲明的,在K&R中你根本沒有注意到參數的個數。 – 2010-04-09 13:48:36

相關問題