パスワードを忘れた? アカウント作成
569829 journal

okuの日記: Extern Inlines By Default

日記 by oku

俄には信じられないのですが、 Glen McCluskey & Associates LLCNotes From ANSI/ISO にある Extern Inlines By Default の記事は本当でしょうか?

曰く、

In the original C++ language, inline functions always had internal linkage. Then a change was made to allow the possibility of external linkage. Now a change has been made to make external linkage the default.

元々の C++ 言語では、inline 関数は常に内部リンケージだった。 次に、外部リンケージも可能なように変更された。 今度は外部リンケージがデフォルトにされてしまった。 (訳注: '96年頃の話)

ざっと JIS X3014.2003 を読んでみたところ、確かに p.86 の補足に inline はリンクの範囲に影響しない旨の記述がありますので、この記事そのものは嘘ではないのでしょう。 しかし、inline 関数は各コンパイル単位の中にいないといけないはず (違った?) なので、記事中にあるような災厄の例は心配無用なのではないかと。 と、最初は思ったのですが...

gcc 3.4.x で試してみた例:

// inline.cpp
#include <iostream>
extern int f(void);
int main(void) { std::cout << f() << '\n'; }

// f1.cpp
inline int f(void) { return 0; }
// ↓コンパイル漏れ回避
int f1(void) { return f(); }

// f2.cpp
inline int f(void) { return 1; }
// ↓コンパイル漏れ回避
int f2(void) { return f(); }

結果:

$ g++ inline.cpp f1.cpp f2.cpp
$ ./a.out
0
$ g++ inline.cpp f2.cpp f1.cpp
$ ./a.out
1
$

な~んてことでしょう~ (棒読み)。

まあ、inline と書いたものは徹頭徹尾 inline と書けば (上記の例では inline.cpp で f() を inline 宣言) 何の問題もないのですが。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...