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