okuの日記: Extern Inlines By Default
俄には信じられないのですが、 Glen McCluskey & Associates LLC の Notes 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 宣言) 何の問題もないのですが。
Extern Inlines By Default More ログイン