亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于暫定定義

關于暫定定義

C++
千萬里不及你 2019-08-03 03:03:21
關于暫定定義我從一本關于暫定定義的書中讀到,暫定定義是沒有存儲類說明符和初始化器的任何外部數據聲明。如果到達翻譯單元的末尾,并且沒有出現帶有標識符初始化器的定義,則暫定定義將成為完整的定義。請解釋上述聲明的含義。另外,宣言和定義之間的區別是什么?因為這件事我搞混了。:(為什么這個程序沒有給出一個錯誤:#include <stdio.h>int a;       //Tentative definitionint a;       //similarly this declaration too.int main()   //not getting any error with this code why its so?{     printf("hi");}此外,這個代碼有什么問題:#include<stdio.h>printf("Hi");int main(void){     return 0;}
查看完整描述

3 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

不,這在C中不違法.在您鏈接到的問題(以及鏈接到的答案的問題)中涉及多個文件。同一文件中的多個(兼容)暫定定義并不違反。這一問題的違反是因為,在翻譯單位的末尾,如果有沒有完全定義的暫定定義,就意味著一個完整的定義。這加上多個文件會導致鏈接時產生多個定義(除了跨多個文件的暫定定義規則的公共擴展外)

查看完整回答
反對 回復 2019-08-04
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

變量聲明表示,“程序中有一個具有以下名稱和類型的變量”。

變量定義“親愛的Compiler先生,現在請為一個變量分配內存,其名稱和類型如下?!?/trans>

因此,對于同一個變量可以有多個聲明,但是應該只有一個定義。

在C中,純聲明(也不是定義)前面有關鍵字extern..因此,由于在第一個示例中沒有這個關鍵字,所以有兩個定義。表面上看,這似乎是一個問題(實際上是C+中的一個錯誤),但是C有一個特殊的“暫定定義”規則,它允許對同一個變量進行多個定義,只要它們都匹配,最多有一個初始化器。C編譯器在幕后將所有暫定定義合并到一個定義中。

如果您試圖初始化這兩個定義,如下所示:

int a = 1;int a = 2;

那你就犯了個錯誤。

你的第二個問題更直截了當。在C中,您不能在函數正文之外有可執行語句。這是不允許的。想想看:如果允許的話,你希望它什么時候運行?




查看完整回答
反對 回復 2019-08-04
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊


第一種方法之所以有效,是因為您對a都是試探性的,只要你認為合適,就可以經常重復。在翻譯單元的末尾,還沒有看到非暫定的定義,因此您為屬性指定的內容與默認設置相結合,從而給出了a,因此它將具有外部鏈接、靜態存儲持續時間,并被初始化為0。

第二個問題與暫定定義無關。你的printf("Hi");需要在一個函數中工作-它不是一個聲明或定義(試探性的或其他的);它只是不允許的。


查看完整回答
反對 回復 2019-08-04
  • 3 回答
  • 0 關注
  • 510 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號