簡體   English   中英

這有什么樣的功能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM