[英]What kind of c function is this?
我正在閱讀“C編譯器設計”一書。 在基礎部分,我發現lexer的ac片段是這樣的 -
static int Lookahead = -1;
int match(token)
int token;
{
if(Lookahead == -1)
Lookahead = lex();
return token == Lookahead;
}
void advance(){
Lookahead = lex();
}
我對如何在gnu gcc上編譯匹配函數感到困惑。 所以我寫了一個看起來像的函數
int a(token)
int token;
{
printf("Value of token is %d", token);
}
int main()
{
printf("Hello world!\n");
a(1);
return 0;
}
我得到以下輸出 -
你好,世界! 令牌的值為1
但我沒有得到功能聲明背后的原因。 以這種方式聲明功能有什么好處? 而令牌的價值如何為1? 為什么它不是編譯錯誤? 它是C中的某種函數聲明嗎?
謝謝你查看我的問題。 任何形式的幫助都會很棒。
它是舊的,不贊成使用的K&R風格的功能聲明。
int match(token)
int token;
{
// Function body
}
相當於
int match(int token)
{
// Function body
}
除了在前者中,編譯器不會檢查函數是否使用正確數量的參數調用,也不會檢查參數的類型。 它依賴於默認參數促銷。
C89和C99也支持這種風格。
這是Kernighan和Ritchie首次開發C編程語言時C函數的原始方式。 它被稱為'K&R C'
C經歷了一個標准化過程,這種形式的功能聲明被改為你習慣的那種。
在http://en.wikipedia.org/wiki/The_C_Programming_Language頁面上,本書的第一版將具有舊樣式函數聲明,我認為它已在第二版中刪除。
原始K&R C中的函數定義更簡單。 在您的示例中,函數參數令牌的類型聲明實際上是多余的。 代碼可以通過這種方式簡化:
static int Lookahead = -1;
int match(token) {
if (Lookahead == -1)
Lookahead = lex();
return token == Lookahead;
}
void advance(){
Lookahead = lex();
}
實際上函數返回類型和變量類型也默認為int,void尚未發明,return語句是可選的......導致進一步簡化:
static Lookahead=-1;
match(token){
if(Lookahead==-1) Lookahead=lex();
return token==Lookahead;
}
advance(){Lookahead=lex();}
這種原始樣式更緊湊,但非常容易出錯,並且不再受現代合規編譯器的支持。 您的示例中的函數定義語法仍然受支持,但被認為是過時的,並且可能在某些時候消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.