簡體   English   中英

C ++模塊是否會導致ODR違規?

[英]Do C++ modules make ODR violations absent?

N4720 C ++模塊草案中,[basic.def.odr] / 6說:

[......] 對於擁有出口申報單的實體,該實體只應有一個定義; 僅當模塊的抽象語義圖包含實體的定義時才需要診斷。 [注意: 如果定義不在接口單元中,則最多一個模塊單元可以擁有並使用該定義。 - 尾注] [...]

根據我的理解,實際上模板只有一次機會被編譯器解析一次,與當前事態形成對比(每個翻譯單元的定義都有一個精確的副本)。 這對於具有類似情況的其他實體也是有效的,例如內聯函數/變量。

我的問題來自這樣一個事實:由於每個翻譯單元最多只能有一個實體定義(如[basic.def.odr] / 1中所述 ),因此在TU中對實體進行不同的定義是未定義的行為。 。 並且,由於導出的實體在整個編譯單元中只有一個定義(使未實現的定義對於它們的實現單元是唯一的),從我的角度來看,定義錯誤即使不是不可能,也是更難的。

最后,簡單地說:將(或確實或應該)模塊的使用使得不可能違反ODR規則,或者更難以出錯?

如果項目完全模塊化(即從不使用#include ),那么大多數意外的ODR違規都會消失。 大多數意外的ODR違規都是由於#include的性質而發生的:包括帶有定義的全局變量等等。 或兩階段模板查找問題,其中兩個文件包含相同的模板,但由於每個模板之前包含的內容,兩個模板的定義不同。

但是,這無助於防止較少的“意外”ODR違規。 由於“同一實體”由其名稱定義,並且實體名稱與從中導出的模塊無關,因此兩個模塊可以提供同一實體的不同定義。 基本上,名稱沖突。

如果單個翻譯單元導入這兩個模塊,這只會成為編譯錯誤(即:需要診斷)。 如果兩個單獨的翻譯單元各自包含一個具有不同定義的模塊,則整個程序仍然違反ODR,但不必對其進行診斷。

因此,即使在完全模塊化的代碼庫中,仍然可以違反ODR。

暫無
暫無

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

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