簡體   English   中英

內聯函數中具有內部鏈接的全局變量

[英]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.

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