2017-05-29 28 views
0

我讀類address_v4在Boost庫的源代碼,並有與BOOST_ASIO_DECL宣佈幾個構造函數理解C++類構造函數中的「內聯」?

# define BOOST_ASIO_DECL inline 

(從這裏開始(定義爲內聯)

/// Construct an address from raw bytes. 
BOOST_ASIO_DECL explicit address_v4(const bytes_type& bytes); 

/// Construct an address from a unsigned long in host byte order. 
BOOST_ASIO_DECL explicit address_v4(unsigned long addr); 

(從這裏http://www.boost.org/doc/libs/1_64_0/boost/asio/ip/address_v4.hpphttp://www.boost.org/doc/libs/1_64_0/boost/asio/detail/config.hpp

那麼,爲C++構造函數指定「內聯」的目的是什麼?它與功能意義相同還是意思不同?

+0

在C++中'inline'關鍵字具有相同的含義:它是一個*建議*,允許編譯器內聯該函數。 –

+0

但對於構造函數,它們如何內聯? – desilijic

+1

簡短回答:是的,構造函數和析構函數可以內聯。畢竟,它們只是功能。 – Cornstalks

回答

3

它具有完全相同的含義(如一些程序員花花公子提到的構造函數是一個像任何其他功能),但考慮到任何編譯器(我能想到的)將愉快地忽略你的建議(以決定是否需要內嵌或不使用他所有的知識),那麼它必須有另一個用途...

事實上,它是在那裏定義一個函數(或ctor)在你的頭文件中沒有錯誤鏈接器會提出因爲一個定義規則

請注意,它在函數不具有主體時打開另一個場景:以多個翻譯單元定義函數。在這種情況下,每個實現必須相同(AFAIK,如果我錯了,請糾正我的錯誤)或UB。

簡而言之:在頭文件中定義一個函數並將其用於多個翻譯單元:鏈接器錯誤。將它標記爲內聯,並且錯誤消失(並且不意味着該函數真的被內聯)。

+0

你應該解釋爲什麼錯誤消失在「在頭文件中定義的函數」的情況下 - 也就是說,ODR上下文中的「inline」的含義(因爲這是唯一的* real *,意味着關鍵字有這些天) 。只是說「錯誤消失」並不足以解釋爲什麼*。 –

+0

這個構造函數是否正確(沒有主體並且具有「內聯」)可以在不同的文件中定義多重時間,並且鏈接器能夠正確執行它們? – desilijic

+0

Jesper,我同意這就是爲什麼我之前提到過odr的原因! –