2017-05-29 11 views
0

はこちらから(ここではhttp://www.boost.org/doc/libs/1_64_0/boost/asio/ip/address_v4.hppから)BOOST_ASIO_DECL(インラインとして定義される)C++クラスのコンストラクタの "インライン"について理解していますか?

/// 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); 

と宣言

# define BOOST_ASIO_DECL inline 

を(私はブーストライブラリ内のクラスaddress_v4のソースコードを読んで、いくつかのコンストラクタがありますhttp://www.boost.org/doc/libs/1_64_0/boost/asio/detail/config.hpp

したがって、C++コンストラクタの "インライン"を指定する目的は何ですか?関数と同じ意味ですか、別の意味ですか?

+0

'inline'キーワードは、C++のどこでも同じ意味を持ちます。コンパイラが関数をインライン化することができるという*提案*です。 –

+0

しかし、コンストラクタの場合、どのようにインライン化できますか? – desilijic

+1

短い答え:はい、コンストラクタとデストラクタはインライン化できます。結局のところ、それらは単なる機能です。 – Cornstalks

答えて

3

それはまったく同じ意味を持っている(としてctorのを指摘し一部のプログラマの男は他のどのような関数である)が、インラインが必要な場合は、どのコンパイラが(私は考えることができる)幸せに決定する(あなたの提案を無視することを考えますまたは彼の知識をすべて使用していない場合)、別の用途が必要です。

実際には、定義ルールのためにリンカーが発生させるエラーなしに、ヘッダーファイルに関数またはctorを定義することができます

関数が本体を持たない場合、別のシナリオが開きます:複数の翻訳単位で関数を定義することに注意してください。この場合、各実装は同じでなければなりません(AFAIK、間違っていれば修正してください)か、それともUBです。

要するに、ヘッダーファイルに関数を定義し、それを複数の翻訳単位で使用する:リンカーエラー。それをインラインとマークし、エラーはなくなります(実際にインライン化されていることは意味しません)。

+0

ODRコンテキスト内の 'inline'の意味(なぜなら、これらの日にはキーワードが存在する唯一の* real *なので)、なぜ"エラーがヘッダーに定義された関数 " 。ただ「エラーが消えた」と言っても、なぜ* why *の説明で十分ではありません。 –

+0

このコンストラクタ(本体がなく、 "インライン"を持つ)は、異なるファイルで複数回の時間を定義でき、リンカが正しく進めることができますか? – desilijic

+0

Jesper、私はそれが前に段落に言及した理由に同意します! –

関連する問題