簡體   English   中英

聲明和定義之間的沖突是否會導致未定義的行為?

[英]Does the confliction between declaration and definition cause undefined behavior?

例如,在一個源文件中:

extern int a[10];
int main()
{
   (void)sizeof(a);
   return 0;
}

在第二個源文件中,我們有:

int a[20];//different with the first source 

上面的代碼是否會導致未定義的行為 據我所知,在C中它說:

引用同一對象或函數的所有聲明都應具有兼容類型; 否則,行為未定義。

int[10]int[20]兼容(在c的視圖中)? 那么C ++標准呢?

此外,如果沒有第二個源文件,使用sizeof(a)是否合法( a只有一個聲明)?

是的,這是C中未定義的行為,它們不兼容,參見C11 6.7.6.2數組聲明符第6段

要使兩個數組類型兼容,兩者都應具有兼容的元素類型,如果兩個大小說明符都存在,並且是整數常量表達式,則兩個大小說明符應具有相同的常量值。 如果在要求它們兼容的上下文中使用這兩種數組類型,則如果兩個大小說明符計算為不相等的值,則它是未定義的行為。

來自[basic.link] p11的 C ++中沒有需要診斷的錯誤

在對類型進行所有調整(其中typedef由其定義替換)之后,引用給定變量或函數的所有聲明指定的類型應該是相同的,除了數組對象的聲明可以指定由於存在或不同而存在的數組類型沒有主要數組綁定([dcl.array])。 違反此規則的類型標識不需要診斷。

一些實現將根據由平台的一組約定定義的規則來處理導入和導出的符號,這些約定通常在文檔中描述,在現代的說法中,該文檔稱為應用程序二進制接口。 如果一個模塊(編譯單元)導出符號而另一個模塊導入它,則每個定義及其交互將按照ABI所描述的方式運行,而不管導入或導出符號的代碼語言規則如何。

其他實現,尤其是那些使用整個程序優化的實現,可以處理從一個C編譯單元導出的符號,並以不同於ABI建議的方式使用另一個C編譯單元,特別是如果這樣做會使事情更有效,或者允許構建系統以產生更好的診斷。

由於這兩種方法都有很多優點和缺點,因此標准對於實現如何處理不同模塊中的函數之間的交互是不可知的。 如果平台ABI恰好定義了行為, 並且 C實現文檔表明C模塊以ABI定義的方式進行交互,則無論標准是否強加任何要求,都將在該實現上定義行為。 在標准沒有要求的其他情況下,任何事情都可能發生。

暫無
暫無

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

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