[英]Global variables with internal linkage in inline functions
我有一個val.h
源代碼文件,帶有帶有內部鏈接和內聯函數的全局變量,該變量返回其地址:
// val.h
#pragma once
static int val;
inline int* get_val()
{
return &val;
}
然后,此標頭包含在兩個不同的翻譯單元中。 如果我在這兩個單元中都調用&val
,則會得到兩個不同的地址,因為val
具有內部鏈接並且每個翻譯單元都有自己的val
,所以沒關系。 但是,如果我在這兩個單元中都調用get_val()
, get_val()
得到兩個相等的地址。
標准是否保證了這種行為,我們是否會始終從任何轉換單元獲得由get_val()
調用返回的相同值?
如果編譯器決定進行真正的內聯,即僅用每個轉換單元中的&val
語句替換get_val()
調用,該get_val()
? 在這種情況下,我們會為每個翻譯單位獲得不同的地址嗎?
您的函數違反了一個定義規則,因為表達式val
引用了不同翻譯單元中的不同實體。
其行為是不確定的。
有了它,將頭文件包含在兩個不同的翻譯單元中時,您將得到不確定的行為。 這是因為表達式return &val
將引用兩個不同的對象。 因此, getVal
的主體在兩個翻譯單元中都不同,但是getVal
具有外部鏈接。 因此,您違反了一個定義規則。
為了克服這個問題,您還必須為getVal
定義內部鏈接,即編寫static int* get_val() { ...
僅關鍵字inline
不會定義外部或內部鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.