簡體   English   中英

C語言中的隱式聲明

[英]Implicit declaration in C language

請考慮Dennis ritchie的C書中的以下引用

所有變量必須在使用前聲明,盡管某些聲明可以由內容隱式進行。

眾所周知,任何類型的所有變量必須在進一步使用之前聲明。 我不知道聲明的后半部分, 某些聲明可以由內容隱含地進行

在C中,通常,變量屬於char,int,float,double四種基本數據類型。 如何在沒有任何聲明之前使用這些數據類型的變量。 請提供一個示例,顯示基於變量保存的內容的隱式聲明。

通過“某些聲明”,作者意味着聲明不是變量的事物。 在編寫本書時,C允許隱式聲明函數:編譯器只是假設函數返回整數。 現代C標准使這種聲明非法。

當編寫第一版K&R時,沒有C標准。 在編寫第二版K&R時,C89 / C90標准即將完成。 由於C89最終確定之前編寫的代碼遺留問題,標准必須允許:

#include <stdio.h>

double sqrt();

main(argc, argv)
    char **argv;
{
    if (argc > 1)
        printf("sqrt(%s) = %f\n", argv[1], sqrt((double)atoi(argv[1])));
    else
        printf("sqrt(%.0f) = %f\n", 2.0, sqrt(2.0));
    return 0;
}

請注意, main()的返回類型是隱式int ; 函數參數argc是隱式int ; 函數atoi()的隱式返回類型為int 另請注意, sqrt()的參數必須顯式為double值; 編譯器無法自動轉換參數類型,因為原型在C89標准之前不是C的一部分。

C99或C11編譯器不再接受此類代碼。 你可以使用:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    if (argc > 1)
        printf("sqrt(%s) = %f\n", argv[1], sqrt(atoi(argv[1])));
    else
        printf("sqrt(%.0f) = %f\n", 2.0, sqrt(2));
    return 0;
}

這使用標准頭來聲明具有完整原型的函數,因此不再需要將參數sqrt()sqrt() 在C99或C11中,您可以省略return 0; 效果會一樣。 就個人而言,我不喜歡允許這樣做的漏洞並繼續明確地寫回報。 在C90中返回是必要的,以向環境發送確定狀態(例如,調用程序的shell)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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