c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++)
c ++中的一個定義規則(One definition rule in c++)
根據c ++標準:
任何翻譯單元都不得包含任何變量,函數,類類型,枚舉類型或模板的多個定義。
//--translation_unit.cpp--//
int a;
void foo()
{
int a; //Second defention of a. ODR fails.
}
你能解釋一下ODR實際上是如何運作的嗎?
According to the c++ standard:
No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
//--translation_unit.cpp--//
int a;
void foo()
{
int a; //Second defention of a. ODR fails.
}
Can you explain me how ODR does work actually?
原文:https://stackoverflow.com/questions/23624844
更新時間:2019-12-11 06:16
最滿意答案
這不會破壞規則,因為您定義了兩個不同的變量。 它們具有相同的名稱,但在不同的范圍內聲明,因此是單獨的實體。 每個都有一個單一的定義。
據說函數范圍中的聲明隱藏了全局命名空間中的聲明。 在函數內, 非限定名稱 a引用局部變量,而限定名稱 ::a引用全局。
This doesn't break the rule because you define two different variables. They have the same name, but are declared in different scopes, and so are separate entities. Each has a single definition.
The declaration in the function's scope is said to hide the one in the global namespace. Within the function, the unqualified name a refers to the local variable, while the qualified name ::a refers to the global.
2014-05-13
相關問答
事實是在標準中(3.2一個定義規則): 任何翻譯單元都不得包含任何變量,函數,類類型,枚舉類型或模板的多個定義。 [...] 每個程序應該包含該程序中使用的每個非內聯函數或對象的一個定義; 不需要診斷。 定義可以在程序中顯式出現,它可以在標準庫或用戶定義的庫中找到,或者(在適當的時候)它被隱式定義(見12.1,12.4和12.8)。 內聯函數應在使用它的每個翻譯單元中定義。 The truth is in the standard (3.2 One definition rule) : No tr
...
這不會破壞規則,因為您定義了兩個不同的變量。 它們具有相同的名稱,但在不同的范圍內聲明,因此是單獨的實體。 每個都有一個單一的定義。 據說函數范圍中的聲明隱藏了全局命名空間中的聲明。 在函數內, 非限定名稱 a引用局部變量,而限定名稱 ::a引用全局。 This doesn't break the rule because you define two different variables. They have the same name, but are declared in differe
...
有時,位的位置代表一些位操作,如您的情況: #define DSF_OVER (1<<0) is 1
#define DSF_DISPLAY (1<<1) is 2
#define DSF_CALLFLOW (1<<2) is 4 (This is not 3)
如果您稍后要添加新項目,則可以執行此操作 #define DSF_OVER 1
#define DSF_DISPLAY 2
#define DSF_CALLFLOW 4
#
...
這些是不同的問題。 關于const 從標準(如果太長,只讀粗體部分): 非靜態成員函數 [...]非靜態成員函數可以聲明為const,volatile或const volatile。 這些cv限定符會影響this指針的類型(9.3.2)。 它們還影響成員函數的函數類型(8.3.5); 一個成員函數聲明const是一個const成員函數 ,一個成員函數聲明volatile是一個volatile成員函數,一個成員函數聲明const volatile是一個const volatile成員函數。 [...
...
ifstream::in
是ios_base::in的別名ios_base::in其中ios_base類型為ios_base::openmode類中的靜態成員。 這允許您指定打開模式。 范圍運算符不僅適用于名稱空間,還適用于類/結構,因為它們具有自己的范圍。 因此, somename:: ,這里somename可以是命名空間,也可以是類/結構,它可以擁有可以通過作用域運算符訪問的靜態成員: somename::foo 。 ifstream::in
Is an alias for ios_bas
...
典型情況。 如果extern "C" double log(double)最初在全局命名空間中聲明,那么您已重新聲明它并提供了一個定義。 該實現之前提到的extern "C"繼續進行匹配的重新聲明。 您的定義適用于屬于該實現的函數,并且它是ODR違規。 至于UB的表現:將log視為弱鏈接符號顯然很常見。 您的實現libc.so根據ABI規則覆蓋libc.so (如果實現不執行extern "C" ,它仍然基本上都是相同的。) 其他可能的情況。 如果在namespace std聲明了log ,然后將
...
[basic.def.odr] / 1: 任何翻譯單元都不得包含任何變量,函數,類類型,枚舉類型或模板的多個定義。 變量由[basic] / 6定義: 通過聲明除非靜態數據成員或對象之外的引用引入變量 。 因此,由于非靜態數據成員不是變量,函數,類,枚舉或模板,因此單一定義規則不適用于非靜態數據成員。 [basic.def.odr]/1: No translation unit shall contain more than one definition of any variable, func
...
就像它說的那樣。 您使用不同的定義兩次定義了相同的類S 該語言的制造者宣稱你不會這樣做 。 原因是允許它顯然是荒謬的,并導致您的翻譯單元之間的兼容性中斷。 哪個定義是“正確的”? 您的編譯器應該使用哪個? 一個未命名的命名空間導致兩個定義實際上定義了不同的類S ,它們被正確地命名為類似于my-anonymous-namespace-1::S和my-anonymous-namespace-2::S ,盡管你永遠不能引用它們這樣,因為名稱空間是匿名的。 It's just as it says. Yo
...
如果cppreference.com不同意C ++標準的實際文本,則cppreference.com是錯誤的。 唯一可以取代標準文本的是該標準的新版本,以及缺陷報告的官方解決方案 (有時會匯總到稱為“技術corrigienda”的文檔中,這是一個很小的版本標準)。 但是,在這種情況下,您誤解了“輸入和輸出操作”對cppreference.com的意義。 (如果內存服務,則該文本將從標準的舊版本逐字逐句獲取。)存儲器的存儲不是輸出操作。 只有寫入文件 (即任何stdio.h或iostream輸出流,
...
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西瓜的花里有许多花蓟马会引响西瓜受粉吗
- 下一篇: s3c2440移植MQTT